多个数据框日期和组条件

Multiple dataframe dates and groups conditions

            A    B          C   D  E
0  2002-01-13  Dan 2002-01-15  26 -1
1  2002-01-13  Dan 2002-01-15  10  0
2  2002-01-13  Dan 2002-01-15  16  1
3  2002-01-13  Vic 2002-01-17  14  0
4  2002-01-13  Vic 2002-01-03  18  0
5  2002-01-28  Mel 2002-02-08  37  0
6  2002-01-28  Mel 2002-02-06  29  0
7  2002-01-28  Mel 2002-02-10  20  0
8  2002-01-28  Rob 2002-02-12  30 -1
9  2002-01-28  Rob 2002-02-12  48  1
10 2002-01-28  Rob 2002-02-12   0  1
11 2002-01-28  Rob 2002-02-01  19  0

Wen一个小时前回答了一个很相似的问题,但是我忘了加上一些条件。我会用 粗体:

写下来

我想为每个 B 组创建一个新的 df['F'] 列,具有下一个条件 并忽略 D 列中的零 :

输出应该是:

            A    B          C   D  E   F
0  2002-01-13  Dan 2002-01-15  26 -1  10
1  2002-01-13  Dan 2002-01-15  10  0  10
2  2002-01-13  Dan 2002-01-15  16  1  10
3  2002-01-13  Vic 2002-01-17  14  0  14
4  2002-01-13  Vic 2002-01-03  18  0  14
5  2002-01-28  Mel 2002-02-08  37  0  33
6  2002-01-28  Mel 2002-02-06  29  0  33
7  2002-01-28  Mel 2002-02-10  20  0  33
8  2002-01-28  Rob 2002-02-12  30 -1  39
9  2002-01-28  Rob 2002-02-12  48  1  39
10 2002-01-28  Rob 2002-02-12   0  1  39
11 2002-01-28  Rob 2002-02-01  19  0  39

回复:

df['F']=abs((df.C-df.A).dt.days-10)# get the days different 
df['F']=df.B.map(df.loc[df.F==df.groupby('B').F.transform('min')].groupby('B').D.mean())# find the min value for the different , and get the mean 
df

但现在我无法插入新的条件(我以 粗体 形式输入)。

将映射器更改为

m=df.loc[(df.F==df.groupby('B').F.transform('min'))&(df.D!=0)].groupby('B').apply(lambda x : x['D'][x['E']==0].mean() if (x['E']==0).any() else x['D'].mean())

df['F']=df.B.map(m)