我有以下pandas DataFrame:
PN | LastS | CurrentS | Price
111111 | 100001 | 100002 | 28
111111 | 100001 | 100001 | 32
111111 | 100001 | 100004 | 48
111111 | 100001 | 100003 | 19
222222 | 100004 | 100001 | 200
222222 | 100004 | 100003 | 236
222222 | 100002 | 100005 | 397
222222 | 100003 | 100006 | 302
对不起家伙,最初问题不清楚,我的错。因此,列LastS代表以前的供应商,列CurrentS代表当前供应商。我想找出给定的部件号(在我们的案例中为111111或222222):
1)如果所有以前的供应商都是相同的,那么LastS列中的所有值对于每个PN都是相同的(1,2,3,4行代表相同的PN)。在这种情况下 - 100001.如果这是真的,那么在CurrentS列中找到这个值(但只迭代第一个PN - 111111)。然后在我们的案例中,我们在第2行找到它并从列价格中取相应的价格并将其放入新列新价格中。
2)如果给定部件号的先前供应商与PN-222222的情况不同,我们取该PN的最后一行(LastS-100003列的最后一行)并继续使用与之相同的逻辑(在CurrentS列中找到第6行的值并取相应的价格)
我试图运行for循环,按'PN'列分组,然后检查列'LastS'的max()== min()。如果这是真的,我不知道如何继续,如果有可能给出当前的数据结构。
我希望以这种方式呈现最终结果:
PN | LastS | CurrentS | Price | New Price
111111 | 100001 | 100002 | 28 | 32
111111 | 100001 | 100001 | 32 | 32
111111 | 100001 | 100004 | 48 | 32
111111 | 100001 | 100003 | 48 | 32
222222 | 100004 | 100001 | 200 | 236
222222 | 100004 | 100003 | 236 | 236
222222 | 100002 | 100005 | 397 | 236
222222 | 100003 | 100006 | 302 | 236
你真的有一个条件;如果值都相同,那么你仍然想要获取最后一个LastS
值。
我们得到最后一个值,然后合并以选择正确的CurrentS
行,并将每个PN的价格带回地图:
df1 = df.groupby('PN').LastS.last().to_frame('CurrentS').reset_index()
s = df.merge(df1).rename(columns={'Price': 'New Price'}).set_index('PN')['New Price']
df['New Price'] = df['PN'].map(s)
PN LastS CurrentS Price New Price
0 111111 100001 100002 28 32
1 111111 100001 100001 32 32
2 111111 100001 100004 48 32
3 111111 100001 100003 19 32
4 222222 100004 100001 200 236
5 222222 100004 100003 236 236
6 222222 100002 100005 397 236
7 222222 100003 100006 302 236