基于分组依据和逻辑过滤创建新列

时间:2015-11-12 23:45:26

标签: pandas lambda group-by transform calculated-columns

我有一个数据框,其中有两列'a'和'b'。我想创建一个新列,它将具有通过以下sql语句获得的值。我怎样才能在熊猫中实现同样的目标。

df ['c'] =从df组中选择'a',计数('b'= 1然后'a'为空结束时的情况)'a'

df = pd.DataFrame({'a':['a','a','b','a','b'], 'b' : [1,0,0,1,1]})
df =    a   b
0       a   1
1       a   0
2       b   0
3       a   1
4       b   1

我在下面试过

df['c'] = df.groupby('a').apply(lambda x : x[x['b']==1]['a'].count()).reset_index().ix[:,-1]

但出错了

    a   b   c
0   a   1   2
1   a   0   0
2   b   0   NaN
3   a   1   NaN
4   b   1   NaN
enter code here

我确实期望2,NAN,NaN,2,1 将高度赞赏所有的帮助和指导

1 个答案:

答案 0 :(得分:0)

我会创建一个虚拟列来执行此操作:

In [11]: df["c"] = df["b"] == 1

In [12]: df["c"]
Out[12]:
0     True
1    False
2    False
3     True
4    False
Name: c, dtype: bool

In [13]: df.groupby("a")["c"].sum()
Out[13]:
a
a    2
b    0
Name: c, dtype: float64

这样可以避免申请,因此效率更高。

注意:检查相等并对布尔值求和与计算相等的条目数相同。

如果你想让这个新的c列通过df传播,你可以使用transform:

In [14]: df.groupby("a")["c"].transform("sum")
Out[14]:
0    2
1    2
2    0
3    2
4    0
dtype: float64