【问题标题】:Summarizing count and value totals from a column of dataframe based on conditions根据条件从数据框列中汇总计数和值总计
【发布时间】:2021-03-11 11:55:29
【问题描述】:

我有一个数据框,其中包含(例如)不同产品的发票明智价格调整值。

例如:

df = pd.DataFrame({'col1': ['A','A','B','B','C','C','A','A','A','A'],
              'sum'  : [10,-10,10,10,0,-10,-10,0,10,0]})

我需要创建一个汇总表,例如在 for col1 = 'A':

           Count    Value
Positve
Negative
NIL

到目前为止,我正在这样做:

result = pd.DataFrame(columns=['Count','Value'],index=['Positve','Negative','NIL'])
result.iloc[0,0] = df[(df['col1'] = 'A') & (df['sum'] > 0)]['sum'].count()
result.iloc[0,1] = df[(df['col1'] = 'A') & (df['sum'] > 0)]['sum'].sum()
result.iloc[1,0] = df[(df['col1'] = 'A') & (df['sum'] < 0)]['sum'].count()
result.iloc[1,1] = df[(df['col1'] = 'A') & (df['sum'] < 0)]['sum'].sum()
result.iloc[2,0] = df[(df['col1'] = 'A') & (df['sum'] == 0)]['sum'].count()
result.iloc[2,1] = df[(df['col1'] = 'A') & (df['sum'] == 0)]['sum'].sum()

有没有更好更快的方法来代替为汇总表中的每个值编写一行代码?我想不出这里有什么。

【问题讨论】:

    标签: python-3.x pandas dataframe summary


    【解决方案1】:

    首先使用np.signSeries.map 映射到新列,然后仅过滤A 并通过命名聚合在GroupBy.agg 中聚合countsum

    df['new'] = np.sign(df['sum']).map({0:'NIL', 1:'POS', -1:'NEG'})
    
    df1 = df[df['col1'].eq('A')].groupby('new').agg(Count=('new','size'), Val=('sum','sum'))
    print (df1)
         Count  Val
    new            
    NEG      2  -20
    NIL      2    0
    POS      2   20
    

    如果需要计算所有值,请在groupby 中添加另一列:

    df2 = df.groupby(['col1', 'new']).agg(Count=('new','size'), Val=('sum','sum'))
    print (df2)
              Count  Val
    col1 new            
    A    NEG      2  -20
         NIL      2    0
         POS      2   20
    B    POS      2   20
    C    NEG      1  -10
         NIL      1    0
    

    【讨论】:

    • 对于其他人,只是为了澄清关于 agg() 的语法,第一个 '' 是数据框中的列名,下一个 '' 是聚合函数。
    猜你喜欢
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2013-10-11
    • 1970-01-01
    • 1970-01-01
    • 2016-12-05
    • 2017-12-27
    • 2016-10-12
    相关资源
    最近更新 更多