我有一个如下所示的 pd.DataFrame,
Hr Name Count Day
6 1318 10.0 Friday
7 1318 20.0 Friday
8 1318 2.0 Friday
9 1318 18.0 Friday
6 1318 2.0 Monday
7 1318 15.0 Monday
8 1318 2.0 Monday
9 1318 5.0 Monday
6 1319 20.0 Friday
7 1319 30.0 Friday
8 1319 50.0 Friday
9 1319 5.0 Friday
6 1319 3.0 Monday
7 1319 30.0 Monday
8 1319 2.0 Monday
9 1319 5.0 Monday
我想迭代每个 Count 并按名称求和,如果值 >=20,则设为 1。最后计算超过>=20 的次数。
当 Count 的总和达到 >=20 时,下一个值应与实际值一起计算。
预期操作:
[{'Friday' :[2,3],'Monday':[1,1]}]
以下是周五的做法:
1318Friday[10+20=30 30 >=20 so 1, 2+18 =20 again 1, Total is 2]
1319Friday[20 20 >=20 so 1, 30 again 1,50 again 1,5 is !>=20, Total is 3]
Finally {'Friday' : [2,3]}
我试过的代码:
finalresult = [data]
df = pd.DataFrame(finalresult)
df['csum'] = df.groupby(['Day','Name'])['Count'].cumsum()
最佳答案
您可以通过 apply
对分组数据的自定义函数执行此操作。
## custom function
def get_cumsum(x):
adds = 0
counter = 0
for i in x:
counter += i
if counter >= 20:
adds += 1
counter=0
return adds
## apply the function to dataframe
df1 = df.groupby(['Name','Day'])['Count'].apply(get_sum).reset_index()
## get dict
df1.groupby('Day')['Count'].apply(list).to_dict()
{'Friday': [2, 3], 'Monday': [1, 1]}
解释:
关于python-3.x - cumsum 与平均值 - python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50349551/