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)
我一整天都被困住了,已经阅读了无数 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)