不确定当前的数据结构是否合适

问题描述 投票:0回答:1

我有以下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
python pandas
1个回答
1
投票

你真的有一个条件;如果值都相同,那么你仍然想要获取最后一个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)

Output:

       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
© www.soinside.com 2019 - 2024. All rights reserved.