我有一个如下所示的 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]}

解释:
  • 每次总和达到 >= 20 时该函数重置并重新开始计数
  • 我们将该函数应用于分组数据以查找每天和名称的计数信息。
  • 最后,我们将步骤 2 的结果转换为 dict 以获得所需的结果。
  • 关于python-3.x - cumsum 与平均值 - python,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50349551/

    10-16 00:56