Python 不确定当前数据结构是否合适
我有以下数据帧:Python 不确定当前数据结构是否合适,python,pandas,Python,Pandas,我有以下数据帧: 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 | 3
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或22222)的情况:
1) 如果所有之前的供应商都相同,即LastS列中的所有值对于每个PN都相同(第1、2、3、4行代表相同的PN)。在本例中为-100001。如果这是真的,那么在列CurrentS中找到这个值(但是只迭代第一个PN-111111)。然后在我们的例子中,我们在第2行找到它,从列price中获取相应的价格,并将其放入新的列newprice中
2) 如果给定零件号的先前供应商与PN-2222222的情况不同,我们将取该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)
输出:
真的不清楚你在问什么。如果你说“对于每一行,检查该行的持续时间是否与该行的电流相同”,那么搜索该电流就没有任何意义。如果这不是你的意思,那么我只能推测你的意思。电流在每个组中不重复吗?我想他的意思是1)如果存在一行,其中电流=持续时间,则将该行r的价格输出到与r共享一个PIN的所有行,否则2)不知道(如果按持续时间然后电流排序,则可能从最后一行获取价格)我不明白你是如何达到期望的产量的。根据您的问题(特别是条件2)。举个例子,根据你所说的,你应该在第6行有新的价格=48(10003的最后一次出现在第4行,它的价格是48)。也许我误解了,但它似乎适用于第1组。在LastS中取最后一个值。基于该值。2.在当前S3中查找具有该值的行。使用该行的价格。
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