【发布时间】:2017-11-07 13:46:52
【问题描述】:
我有一个这样的数据框:
data = {
'YEAR' : [2018,2018,2017,2018,2018,2018],
'SEASON': ['SPRING', 'SPRING', 'WINTER', 'SPRING', 'SPRING', 'SPRING'],
'CODE': ['A', 'A', 'A', 'B', 'C', 'D'],
'BUDGET': [500,200,300,4000,700,0],
'QUANTITY': [1000,1000,1000,2000,300,4000]
}
df = pd.DataFrame(data)
'''
BUDGET CODE QUANTITY SEASON YEAR
0 500 A 1000 SPRING 2018
1 200 A 1000 SPRING 2018
2 300 A 1000 WINTER 2017
3 4000 B 2000 SPRING 2018
4 700 C 300 SPRING 2018
5 0 D 4000 SPRING 2018
'''
对于每个 CODE,我得到了正确的 BUDGET 数量,但是不幸的是,在 QUANTITY 列上我得到了该代码在每个 [Year, Season] 内的总数量。
我正在开发一个函数来聚合作为输入的不同级别的数据框:例如,我正在为函数提供一个类似
的列表my_list = [
['YEAR']
['YEAR', 'SEASON']
]
该函数将输出一系列按每个子列表分组的数据帧。
这里的问题是我可以将 CODE 与 pd.Series.nunique 聚合,并且我可以sum BUDGET 列,但如果我 sum 也是 QUANTITY 列,我显然会总结比我想要的更多。我需要的是某种 sumUniques 函数,由 uniques YEAR、SEASON、CODE 组成。
def sumUniques(x):
return '???'
print(df.groupby(['YEAR', 'SEASON']).agg({
'CODE': pd.Series.nunique,
'BUDGET': sum,
'QUANTITY' : sumUniques
}))
'''
CODE BUDGET QUANTITY
YEAR SEASON
2017 WINTER 1 300 ???
2018 SPRING 4 5400 ???
--> EXPECTED RESULT:
CODE BUDGET QUANTITY
YEAR SEASON
2017 WINTER 1 300 1000
2018 SPRING 4 5400 7300
'''
我在问自己哪一种可能是实现这一目标的最佳方式,我遇到了Zero's answer to "Pandas: sum values from column to unique values":我已经尝试过了,似乎我没有正确应用它,或者这不适用于我的问题,因为它引发了关键错误:
print(df.groupby(['YEAR', 'SEASON']).agg({
'CODE': pd.Series.nunique,
'BUDGET': sum,
'QUANTITY' : lambda x: x.groupby('CODE').QUANTITY.first().sum()
}))
'''
KeyError: 'CODE'
'''
我想知道实现这项工作的最佳方法是什么,希望这对其他人也有帮助!
【问题讨论】:
-
如果您的问题得到解决,请接受对您有帮助的答案。谢谢。
-
我添加了带有计时的新解决方案,你能用你的真实数据检查它吗?
标签: python pandas dataframe group-by pandas-groupby