我有一个如下数据框
df=pd.DataFrame({'a':['a','a','b','a','b','a','a','a'], 'b' : [1,0,0,1,0,1,1,1], 'c' : [1,2,3,4,5,6,7,8],'d':['1','2','1','2','1','2','1','2']})
df
Out[94]:
a b c d
0 a 1 1 1
1 a 0 2 2
2 b 0 3 1
3 a 1 4 2
4 b 0 5 1
5 a 1 6 2
6 a 1 7 1
7 a 1 8 2
在[97]中:
df[(df['a']=='a') & (df['b']==1)].groupby('d')['c'].
Out[97]:
a b c d sum
0 a 1 1 1 8
1 a 0 2 2 NaN
2 b 0 3 1 NaN
3 a 1 4 2 18
4 b 0 5 1 NaN
5 a 1 6 2 18
6 a 1 7 1 8
7 a 1 8 2 18
dtype: float64
我想将此总和作为dataframe df中的新列。所以最终输出将如下所示
a b c d sum
0 a 1 1 1 8
1 a 0 2 2 18
2 b 0 3 1 8
3 a 1 4 2 18
4 b 0 5 1 8
5 a 1 6 2 18
6 a 1 7 1 8
7 a 1 8 2 18
我将感谢所有的帮助和指导。非常感谢。 如果我必须在SQl中执行此操作,查询将如下所示 选择 * 来自df 内部联接 (选择 'd' ,sum('a'= 1&'b'= 1然后'c'表示null结束时)总和 来自df 通过...分组 DF 内心的 在df.'d'= inner.'d' 我想尽可能避免合并
答案 0 :(得分:0)
In [30]:
mask = np.logical_and( df['a'] == 'a' , df['b'] == 1 )
mask
Out[30]:
0 True
1 False
2 False
3 True
4 False
5 True
6 True
7 True
Name: a, dtype: bool
In [32]:
df['sum'] = df.groupby(df.d)['c'].transform(lambda x : x[mask].sum())
df
Out[32]:
a b c d sum
0 a 1 1 1 8
1 a 0 2 2 18
2 b 0 3 1 8
3 a 1 4 2 18
4 b 0 5 1 8
5 a 1 6 2 18
6 a 1 7 1 8
7 a 1 8 2 18