Pandas应用于缺少日期的多行

2024-10-01 07:49:49 发布

您现在位置:Python中文网/ 问答频道 /正文

对于Pandas数据帧,我正在寻找一种矢量化的方法来计算每个给定组的视图数的累计和,除了一个多星期前的视图。我试过各种应用程序功能,但我似乎不能上下7天收集我需要的数据。在

我有一个可以处理少量数据的函数,但是因为它是一个循环,所以对所有数据都要花费太长的时间。有2500多个组,每个组有大约100个日期填写。总共有250000多条记录。在

例如,我考虑过使用shift,但由于不是所有组都填写了所有日期,所以这不起作用。我也试过用地图功能,这看起来也太长了。在

我的熊猫数据框是这样的:

    GROUP DAY           VIEWS   VIEWS_CUM
165 1     2011-09-18    82      82
166 1     2011-09-19    15      97
167 1     2011-12-21    29      126
168 1     2011-12-22    15      141
169 1     2011-12-23    2       143
170 2     2012-01-07    51      51
171 2     2012-01-08    10      61
172 2     2012-01-09    11      72
173 2     2012-01-17    33      105
174 2     2012-01-18    29      134
175 2     2012-01-19    6       140

我想要这样的东西:

^{pr2}$

看似有效但速度太慢的函数:

^{3}$

Tags: 数据方法函数功能视图应用程序pandasshift
2条回答

如果时间间隔的大小相同,可以执行以下操作:

import pandas as pd
from pandas.stats.moments import rolling_sum

def processGroup(df):
    df = df.sort('DATE')
    df['VIEWS_CUM_BEFORE'] = rolling_sum(df['VIEWS'], window = 7 * 7, min_periods = 1)
    return df

df = df.groupby('GROUP').transform(processGroup)

我将数据按7天分组,累计和在VIEWS_CUM_BEFORE列中。在

只有一列溶液或

df = df.drop(['VIEWS_CUM'], axis=1)
df['VIEWS_CUM_BEFORE'] = df.groupby([pd.Grouper(freq='7D',key='DAY'),'GROUP']).cumsum()

定义cumsum解决方案列或

^{pr2}$

小茴香溶液

df['VIEWS_CUM_BEFORE'] = df.groupby([pd.Grouper(freq='7D',key='DAY'),'GROUP'])['VIEWS'].apply(np.cumsum)

但是cumsum计算第一个子组,并且需要0值它们。在

    GROUP        DAY  VIEWS  VIEWS_CUM_BEFORE
0       1 2011-09-18     82                82
1       1 2011-09-19     15                97
2       1 2011-12-21     29                29
3       1 2011-12-22     15                44
4       1 2011-12-23      2                46
5       2 2012-01-07     51                51
6       2 2012-01-08     10                10
7       2 2012-01-09     11                21
8       2 2012-01-17     33                33
9       2 2012-01-18     29                62
10      2 2012-01-19      6                68

我们必须找到组的最小DAY,加上7天,如果这一天较短,则将其设为0。在

def repeat_value(grp):
    grp['DAY2'] = grp['DAY'].min() + pd.Timedelta('7 days')
    return grp
df = df.groupby(['GROUP']).apply(repeat_value)
print df
    GROUP        DAY  VIEWS  VIEWS_CUM_BEFORE       DAY2
0       1 2011-09-18     82                82 2011-09-25
1       1 2011-09-19     15                97 2011-09-25
2       1 2011-12-21     29                29 2011-09-25
3       1 2011-12-22     15                44 2011-09-25
4       1 2011-12-23      2                46 2011-09-25
5       2 2012-01-07     51                51 2012-01-14
6       2 2012-01-08     10                10 2012-01-14
7       2 2012-01-09     11                21 2012-01-14
8       2 2012-01-17     33                33 2012-01-14
9       2 2012-01-18     29                62 2012-01-14
10      2 2012-01-19      6                68 2012-01-14


df.loc[df['DAY2'] > df['DAY'], 'VIEWS_CUM_BEFORE'] = 0
del df['DAY2']
print df
    GROUP        DAY  VIEWS  VIEWS_CUM_BEFORE
0       1 2011-09-18     82                 0
1       1 2011-09-19     15                 0
2       1 2011-12-21     29                29
3       1 2011-12-22     15                44
4       1 2011-12-23      2                46
5       2 2012-01-07     51                 0
6       2 2012-01-08     10                 0
7       2 2012-01-09     11                 0
8       2 2012-01-17     33                33
9       2 2012-01-18     29                62
10      2 2012-01-19      6                68

相关问题 更多 >