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=X
和B
值表示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
答案 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())))