Pandas:添加一个excel SUMIF列,如= A1 / SUMIF(B:B,B1,A:A)

时间:2018-04-27 00:46:25

标签: python pandas

我有一个像pandas DataFrame:

    pet  treats lbs
0   cat    2    5.0
1   dog    1    9.9
2  snek    3    1.1
3   cat    6    4.5
4   dog    1    9.4

我想添加第四列,将每种食物作为此类宠物总食物的百分比。因此,第0行中的治疗值除以匹配“猫”的宠物的所有治疗的总和(以及每行等等)。

在Excel中,我想我会做这样的事情:

   A    B    C    D
1  cat  2   5.0   =B1/SUMIF(A:A,A1,B:B)
2  dog  1   9.9   =B2/SUMIF(A:A,A2,B:B)
3  snek 3   1.1   =B3/SUMIF(A:A,A3,B:B)
4  cat  6   4.5   =B4/SUMIF(A:A,A4,B:B)
5  dog  1   9.4   =B5/SUMIF(A:A,A5,B:B)

任何人都知道我如何使用pandas添加这个“treat_percent”列?

    pet  treats  lbs  treat_percent
0   cat    2    5.0   33.33
1   dog    1    9.9   50.00
2  snek    3    1.1   100.00
3   cat    6    4.5   66.67
4   dog    1    9.4   50.00

到目前为止,我已经尝试过:

df['treat_percent'] = df['pet'] / df.groupby('pet')['treats'].sum()

df['treat_percent'] = df['pet'] / df.loc[df['pet'] == df['pet'], 'treats'].sum()

2 个答案:

答案 0 :(得分:0)

您可以使用transform

df['treat_rate']=df.treats/df.groupby('pet').treats.transform('sum')
df
Out[153]: 
    pet  treats  lbs  treat_rate
0   cat       2  5.0        0.25
1   dog       1  9.9        0.50
2  snek       3  1.1        1.00
3   cat       6  4.5        0.75
4   dog       1  9.4        0.50

答案 1 :(得分:0)

你可以试试:

df['treat_rate'] = df.groupby('pet').treats.apply(lambda x: x/sum(x)) 

或更好:

df['treat_rate'] = df.groupby('pet').treats.transform(lambda x: x/sum(x))