我整天都被困住了,经历过无数的SO文章,我仍然坚持到最后一篇文章。我将CSV导入到一个庞大的数据帧中,然后最终获得了下面较小的数据帧:(注意:我的df现在正在“名称”上编入索引,这是我需要的基础或总和)
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文章都在讨论求和在熊猫的事情,但我几个小时没有运气。非常感谢任何帮助。非常感谢。
编辑: 我正在寻找的输出是以下
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
答案 0 :(得分:2)
选项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
这不会对'Classification'
'Company'
的{{1}}的唯一性做出任何假设,但只会抓住每个'Classification'
的第一个'Company'
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
对评论的回应
关于连接
使用dtypes
检查df.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)