Python Pandas 按列分组数据框/按字符串列对整数列求和

Python Pandas Group Dataframe by Column / Sum Integer Column by String Column

我一整天都被困住了,已经阅读了无数 SO 文章,但仍然停留在我的最后一篇文章上。我将一个 CSV 导入到一个庞大的数据框中,然后最终得到了下面较小的数据框:(注意:我的 df 现在在 'Name' 上建立了索引,这是我需要作为组或总和的基础)

  Name          Classification       Value 1     Value 2
Company 1   Classification Code 1      5000       8000      
Company 1   Classification Code 1      6000       2000
Company 2   Classification Code 1      2000       3000    
Company 2   Classification Code 1      1000       4500     
Company 3   Classification Code 2      15000      10000      
Company 3   Classification Code 2      20000      32000     
Company 4   Classification Code 3      7500       10000    
Company 4   Classification Code 3      7000       1500     

我现在苦恼的是如何根据公司对这两个值求和(我主要使用 groupby 和 sum() 但已经卡了几个小时了。我知道有很多 SO 文章在谈论关于在 pandas 中总结事情,但我已经好几个小时没有运气了。任何帮助将不胜感激。非常感谢。

编辑: 我正在寻找的输出如下

Company 1    Classification Code 1    11,000    10,000
Company 2    Classification Code 1    3,000      7,500
Company 3    Classification Code 2    35,000    42,000
Company 4    Classification Code 3    14,500    11,500

选项 1
set_index 然后 groupby
这假设 'Classification' 列在 Company

中是相同的
df.set_index('Classification', append=True) \
    .groupby(level=[0, 1]).sum().reset_index(1)

                  Classification  Value 1  Value 2
Name                                              
Company 1  Classification Code 1    11000    10000
Company 2  Classification Code 1     3000     7500
Company 3  Classification Code 2    35000    42000
Company 4  Classification Code 3    14500    11500

选项 2
groupby 然后 agg
这不会对 'Company''Classification' 的唯一性做出任何假设,但只会根据 'Company'

获取第一个 'Classification'
df.groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

                  Classification  Value 1  Value 2
Name                                              
Company 1  Classification Code 1    11000    10000
Company 2  Classification Code 1     3000     7500
Company 3  Classification Code 2    35000    42000
Company 4  Classification Code 3    14500    11500

对评论的回复
关于串联
df.dtypes 检查 dtypes。如果您看到 object 而不是 int 那么是的,您需要转换为 numeric

您可以简单地使用

df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

或更多手动

df['Value 1'] = df['Value 1'].astype(int)
df['Value 2'] = df['Value 2'].astype(int)

然后继续之前的建议。

关于列的位置
您可以随时重新排序您的列

d1 = df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

d1[df.columns]

或者

d1 = df.apply(pd.to_numeric, errors='ignore').groupby(level=0).agg(
    {'Classification': 'first', 'Value 1': 'sum', 'Value 2': 'sum'})

d1.reindex_axis(df.columns, 1)