【问题标题】:How to count all positive and negative values in a pandas groupby?如何计算熊猫 groupby 中的所有正值和负值?
【发布时间】:2014-02-13 08:07:07
【问题描述】:

假设我们有一张桌子:

df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8), 'D' : np.random.randn(8)})

输出:

      A       B          C           D
0    foo     one    -1.304026    0.237045
1    bar     one     0.030488   -0.672931
2    foo     two     0.530976   -0.669559
3    bar     three  -0.004624   -1.604039
4    foo     two    -0.247809   -1.571291
5    bar     two    -0.570580    1.454514
6    foo     one     1.441081    0.096880
7    foo     three   0.296377    1.575791

我想计算C列中有多少正数和负数属于A列中的每个组以及比例。 A 中的组比 foo 和 bar 多得多,因此组名不应出现在代码中。

我试图按 A 分组然后过滤,但没有找到正确的方法。还尝试使用一些智能 lambda 进行聚合,但没有成功。

【问题讨论】:

    标签: python lambda pandas


    【解决方案1】:

    您可以将其作为一行应用(第一列为负数,第二列为正数):

    In [11]: df.groupby('A').C.apply(lambda x: pd.Series([(x < 0).sum(), (x >= 0).sum()])).unstack()
    Out[111]: 
         0  1
    A        
    bar  2  1
    foo  2  3
    
    [2 rows x 2 columns]
    

    但是,我认为更简洁的方法是使用虚拟列并使用value_counts

    In [21]: df['C_sign'] = np.sign(df.C)
    
    In [22]: df.groupby('A').C_sign.value_counts()
    Out[22]: 
    A      
    bar  -1    2
          1    1
    foo   1    3
         -1    2
    dtype: int64
    
    In [23]: df.groupby('A').C_sign.value_counts().unstack()
    Out[23]: 
         -1   1
    A          
    bar   2   1
    foo   2   3
    
    [2 rows x 2 columns]
    

    【讨论】:

    • 我想我更喜欢df["C_sign"] = np.sign(df.C)
    • @DSM 同意,这样更好
    猜你喜欢
    • 2020-09-21
    • 1970-01-01
    • 2016-02-20
    • 2017-08-11
    • 1970-01-01
    • 1970-01-01
    • 2023-02-17
    • 2018-10-03
    • 1970-01-01
    相关资源
    最近更新 更多