【问题标题】:Creating a new column based on group by and logical filtering基于分组依据和逻辑过滤创建新列
【发布时间】:2016-02-14 11:48:12
【问题描述】:

我有一个包含“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]

提前感谢所有帮助和指导!

【问题讨论】:

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


    【解决方案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
    

    这样可以避免应用,所以效率会更高。

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

    如果您希望这个新的 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
    

    【讨论】:

    • 您好,安迪,感谢您的意见。它工作得很好但是我需要在这种情况下执行很多操作。例如,在其中一个中,我需要计算排名而不是计数。如果你愿意,我可以为此创建一个不同的帖子。非常感谢您在这方面的帮助。
    • @piyushsharma 请提出一个新问题。 meta.stackexchange.com/questions/5234/… 也就是说,我认为有一个 groupby rank 方法可以做到这一点:)
    • 谢谢安迪,我会发布一个新问题。我知道有一个按等级分组的功能,但到目前为止的挑战是将其与不同列的逻辑运算符结合起来,然后应用于所有行。非常感谢您的帮助。
    猜你喜欢
    • 2022-11-29
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    相关资源
    最近更新 更多