熊猫根据组

时间:2020-05-13 17:40:34

标签: python pandas numpy

我有这样的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) 谢谢

2 个答案:

答案 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