我有这样的df
product type price
A 1 10
A 2 15
A 3 NAN
A 4 20
B 1 40
B 2 30
B 3 NAN
B 4 5
C 1 80
C 2 70
C 3 90
C 4 NAN
D 6 75
D 8 40
我想基于另一个值来更新价格值(不一定是NAN)
If (type == 3):
price == df['type' == 1]
elif ( type == 4):
price == df['type' == 2]
elif ( type == 8):
price == df['type' == 6]
类似这样的情况。我尝试使用以下每个:
df.loc[df['type'] == 3, 'price'] = df[df['type']==1]['price'].iloc[0]
以下方法仅适用于两个产品10
都替换了值A, B and C
。
有没有一种方法可以根据产品组更新此值。预期结果如下:
product type price
A 1 10
A 2 15
A 3 10
A 4 15
B 1 40
B 2 30
B 3 40
B 4 30
C 1 80
C 2 70
C 3 80
C 4 70
D 6 75
D 8 75
注意:在这种情况下,使用transform('first')
可能不合适。不一定每个产品都具有所有类型(1-10)
谢谢
答案 0 :(得分:2)
IIUC,您需要填写每个组的第一个值:
df['price']=df['price'].fillna(df.groupby('product')['price'].transform('first'))
print(df)
product type price
0 A 1 10.0
1 A 2 15.0
2 A 3 10.0
3 A 4 20.0
4 B 1 40.0
5 B 2 30.0
6 B 3 40.0
7 B 4 5.0
EDIT,根据已编辑的问题,您可以尝试旋转并用相应的列填充na:
piv = df.set_index(['product','type'])['price'].unstack()
piv = piv.fillna({3:piv[1],4:piv[2]})
out = piv.stack().reset_index(name='price')
print(out)
product type price
0 A 1 10.0
1 A 2 15.0
2 A 3 10.0
3 A 4 20.0
4 B 1 40.0
5 B 2 30.0
6 B 3 40.0
7 B 4 5.0
8 C 1 80.0
9 C 2 70.0
10 C 3 90.0
11 C 4 70.0
答案 1 :(得分:1)
您可以尝试:
for x,y in zip([3,4,8],[1,2,6]):
df.loc[df['type'].eq(x), 'price'] = df.loc[df['type'].eq(y),'price'].values
输出:
product type price
0 A 1 10
1 A 2 15
2 A 3 10
3 A 4 15
4 B 1 40
5 B 2 30
6 B 3 40
7 B 4 30
8 C 1 80
9 C 2 70
10 C 3 80
11 C 4 70
12 D 6 75
13 D 8 75