使用逻辑切片在panda中创建新列,并按不同列进行分组

时间:2015-11-17 00:17:27

标签: python pandas group-by dataframe calculated-columns

我有一个如下数据框

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' 我想尽可能避免合并

1 个答案:

答案 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