使用按组

时间:2018-04-06 17:09:27

标签: python pandas

             A    B  C  D
0   2002-01-13  200  X  1
1   2002-01-13  180  X  0
2   2002-01-13  250  X -1
3   2002-01-13  300  Y  1
4   2002-01-13  220  Y  0
5   2002-01-13  125  Y -1
6   2002-02-09  410  X  1
7   2002-02-09    0  X  1
8   2002-02-09  550  Y  1
9   2002-02-09  500  Y  1
10  2002-02-09  150  Y -1

我想为每个E组创建一个包含下一个条件的新A列:

  • E值将B表示D=0的平均值(在2002-01-13 A组中,E值将是平均值在180到220之间,即200)。

  • 如果D=0不存在,则E值将介于: B值表示C=XB值表示C=Y时的值,始终排除B个零(2002-02-09 A组,D=0不存在。因此E值将介于410和400之间,即405)。

输出应为:

             A    B  C  D    E
0   2002-01-13  200  X  1  200
1   2002-01-13  180  X  0  200
2   2002-01-13  250  X -1  200
3   2002-01-13  300  Y  1  200
4   2002-01-13  220  Y  0  200
5   2002-01-13  125  Y -1  200
6   2002-02-09  410  X  1  405
7   2002-02-09    0  X  1  405
8   2002-02-09  550  Y  1  405
9   2002-02-09  500  Y  1  405
10  2002-02-09  150  Y -1  405

1 个答案:

答案 0 :(得分:1)

您需要groupby + np.where

df.A.map(df.assign(B=df.B.replace(0,np.nan)).groupby('A').apply(lambda x : np.where((x['D']==0.0).any(),x['B'][x['D']==0].mean() , x.groupby('C')['B'].mean().mean())))
Out[1615]: 
0     200.0
1     200.0
2     200.0
3     200.0
4     200.0
      ...  
6     405.0
7     405.0
8     405.0
9     405.0
10    405.0
Name: A, Length: 11, dtype: object
#df['E']= df.A.map(df.assign(B=df.B.replace(0,np.nan)).groupby('A').apply(lambda x : np.where((x['D']==0.0).any(),x['B'][x['D']==0].mean() , x.groupby('C')['B'].mean().mean())))