【问题标题】:cumsum with average - pythoncumsum 与平均值 - python
【发布时间】:2018-05-15 11:54:57
【问题描述】:

我有一个如下所示的 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 并对 Name 进行求和,如果值 >=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()

【问题讨论】:

  • 一个更好解释的问题。

标签: python-3.x pandas


【解决方案1】:

您可以通过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]}

说明:

  1. 每次总和达到 >= 20 时,该函数都会重置并重新开始计数
  2. 我们将该功能应用于分组数据,以查找每天和姓名的计数信息。
  3. 最后,我们将步骤 2 的结果转换为 dict 以获得所需的结果。

【讨论】:

    【解决方案2】:

    首先创建一个运行天数:

    df['running'] = (df.Day != df.Day.shift(1)).cumsum()
    >>> df
        Hr  Name    Count   Day running
    0   6   1318    10.0    Friday  1
    1   7   1318    20.0    Friday  1
    2   8   1318    2.0 Friday  1
    3   9   1318    18.0    Friday  1
    4   6   1318    2.0 Monday  2
    5   7   1318    15.0    Monday  2
    6   8   1318    2.0 Monday  2
    7   9   1318    5.0 Monday  2
    8   6   1319    20.0    Friday  3
    9   7   1319    30.0    Friday  3
    10  8   1319    50.0    Friday  3
    11  9   1319    5.0 Friday  3
    12  6   1319    3.0 Monday  4
    13  7   1319    30.0    Monday  4
    14  8   1319    2.0 Monday  4
    15  9   1319    5.0 Monday  4
    

    这将允许您按它进行分组。

    现在(不幸的是)创建一个函数来计算超过 20 的计数:

    def count_counts(g):
        s, c = 0, 0
        for e in g:
            s += e
            if s > 20:
                s, c = 0, c + 1
        return c
    

    按天和跑步分组并应用它,然后按天分组并列出结果:

    cc = df.Count.groupby([df.Day, df.running]).apply(count_counts).reset_index()
    >>> cc.Count.groupby(cc.Day).apply(list)
    Day
    Friday    [1, 2]
    Monday    [1, 1]
    Name: Count, dtype: object
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-03
      • 1970-01-01
      • 2022-12-10
      • 2021-03-11
      • 2021-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多