如何在 GroupBy 和连续日期条件下求和值?

发射机

给定表:

身份证 线 网站 日期 单位 总计
1 AAA 2017 年 5 月 2 日 12 30
2 AAA 2017 年 5 月 3 日 10 22
3 AAA 2017 年 5 月 4 日 22 40
4 AAA 2017 年 5 月 20 日 15 44
5 AAA 2017 年 5 月 21 日 8 30
6 BBB 2017 年 5 月 22 日 10 32
7 BBB 2017 年 5 月 23 日 25 52
8 CCC 02-Jun-2017 6 22
9 CCC 03-Jun-2017 4 33
10 CCC 2017 年 8 月 12 日 11 44
11 CCC 2017 年 8 月 13 日 19 40
12 CCC 2017 年 8 月 14 日 30 40

对于每一行,如果 ID,LINE,SITE 等于前一行(天)需要计算如下(最后一天)和(过去 3 天):注意,需要确保日期在 ID,LINE 的“groupby”下是连续的,站点列

身份证 线 网站 日期 单位 总计 最后一天 最近 3 天
1 AAA 2017 年 5 月 2 日 12 30 0 0
2 AAA 2017 年 5 月 3 日 10 22 12/30 12/30
3 AAA 2017 年 5 月 4 日 22 40 10/22 (10+12)/(30+22)
4 AAA 2017 年 5 月 20 日 15 44 0 0
5 AAA 2017 年 5 月 21 日 8 30 15/44 15/44
6 BBB 2017 年 5 月 22 日 10 32 0 0
7 BBB 2017 年 5 月 23 日 25 52 10/32 10/32
8 CCC 02-Jun-2017 6 22 0 0
9 CCC 03-Jun-2017 4 33 6/22 6/22
10 CCC 2017 年 8 月 12 日 11 44 4/33 0
11 CCC 2017 年 8 月 13 日 19 40 11/44 (11/44)
12 CCC 2017 年 8 月 14 日 30 40 19/40 (11+19/44+40)
感觉_FM

在这种情况下,我通常使用 groupby 执行 for 循环:

import pandas as pd
import numpy as np

#copied your table
table = pd.read_csv('/home/fm/Desktop/stackover.csv')
table.set_index('ID', inplace = True)
table[['Last day','Last 3 days']] = np.nan

for i,r in table.groupby(['LINE' ,'SITE']):
    #First subset non sequential dates
    limits_interval = pd.to_datetime(r['DATE']).diff() != '1 days'
    #First element is a false positive, as its impossible to calculate past days from first day
    limits_interval.iloc[0]=False

    ids_subset = r.index[limits_interval].to_list()
    ids_subset.append(r.index[-1]+1) #to consider all values
    id_start = 0

    for id_end in ids_subset:    
        r_sub = r.loc[id_start:id_end-1, :].copy()
        id_start = id_end 

        #move all values one day off, if the database is as in your example (1 line per day) wont have problems
        r_shifted = r_sub.shift(1)

        r_sub['Last day']=r_shifted['UNITS']/r_shifted['TOTAL']

        aux_units_cumsum = r_shifted['UNITS'].cumsum()
        aux_total_cumsum = r_shifted['TOTAL'].cumsum()

        r_sub['Last 3 days'] = aux_units_cumsum/aux_total_cumsum

        r_sub.fillna(0, inplace = True)

        table.loc[r_sub.index,:]=r_sub.copy()

您可以创建一个函数并在 groupby 中应用,它会更清晰:将函数应用于熊猫 groupby会更优雅。希望能帮到你,祝你好运

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何在多个条件和 groupby 下使用 .loc

如何在多个条件下应用Pandas Groupby进行拆分并应用多个计算?

如何在转换条件下转换大熊猫groupby?

如何让groupby()组在一定条件下加倍?

如何在groupby和两个条件下在熊猫中使用.loc

如何在 GroupBy() 之后打印出值?

如何在使用groupby时忽略值

在groupby之后,使用agg,如何在其他列的条件下获取一个元素

如何在条件下使用数组公式求和?

如何在熊猫的条件下选择连续原料

条件下groupby的总和

如何在mongodb中过滤数组和groupBy中的值?

如果列值是日期列表,如何在条件下计算 Pandas DF 中的行数?

使用 groupby 和 idxmax 在特定条件下查找值

如何在Laravel5中对groupBy求和

如何在laravel中使用groupBy查询求和列?

groupby pandas 在特定条件下的均值和总和

如何在Groupby Python中计算平均日期

如何在 Pandas groupby 操作后填写空日期?

如何在特定条件下提取数组中的最高和最低值?

如何在 Pyspark 中使用 groupby 在条件中删除列

如何在条件中使用熊猫groupby.count()

如何在groupby之后进行条件if语句过滤

如何在Python中Groupby之后按条件过滤数据

如何在Groupby中保留其他列的行值?

如何在图表中绘制熊猫groupby值?

如何在groupby中选择空值最少的组?

如何在 PYTHON 中为 groupby 值提供列名

如何在熊猫中找到每组 groupby 的较低值?