I got a dataframe like this:
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
'''
对于每一个代码,我得到了它的正确预算数量,但是不幸的是,在数量列中,我得到了每个[年份、季节]中该代码的总数量。
我正在编写一个函数,以不同的层级进行数据框聚合,例如,我将一个列表作为输入传递给该函数。
my_list = [
['YEAR']
['YEAR', 'SEASON']
]
该函数将会按照每个子列表分组输出一系列数据框。
问题在于,我可以使用pd.Series.nunique 聚合 CODE,并且可以用sum函数求和BUDGET列。但是,如果我也对QUANTITY列进行求和,则会累加超过我的要求。我需要的是一种按独立的YEAR、SEASON、CODE进行的sumUniques函数。
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的答案:“Pandas:将列值求和到唯一值”,我已经尝试过它,但似乎我要么没有正确应用它,要么它不适用于我的问题,因为它引发了一个键错误:
print(df.groupby(['YEAR', 'SEASON']).agg({
'CODE': pd.Series.nunique,
'BUDGET': sum,
'QUANTITY' : lambda x: x.groupby('CODE').QUANTITY.first().sum()
}))
'''
KeyError: 'CODE'
'''
我想知道最好的方法是什么,希望这对其他人也有所帮助!