基于分组依据和逻辑过滤创建新列
Creating a new column based on group by and logical filtering
我有一个包含列 'a' 和 'b' 的 DataFrame。我想创建一个新列,它是此 SQL 语句的结果。
df['c'] = Select 'a' , count (case when 'b' ==1 then 'a' else null end) from df group by 'a'
如何使用 Pandas 实现相同的目的?
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
虽然我在期待 [2,NAN,NaN,2,1]
提前感谢所有帮助和指导!
我会创建一个虚拟列来执行此操作:
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
这样就避免了apply,效率会更高
注意:检查相等性并对布尔值求和与计算相等的条目数相同。
如果你想让这个新的 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
我有一个包含列 'a' 和 'b' 的 DataFrame。我想创建一个新列,它是此 SQL 语句的结果。
df['c'] = Select 'a' , count (case when 'b' ==1 then 'a' else null end) from df group by 'a'
如何使用 Pandas 实现相同的目的?
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
虽然我在期待 [2,NAN,NaN,2,1]
提前感谢所有帮助和指导!
我会创建一个虚拟列来执行此操作:
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
这样就避免了apply,效率会更高
注意:检查相等性并对布尔值求和与计算相等的条目数相同。
如果你想让这个新的 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