Python 如何加快填写熊猫的日期?

Python 如何加快填写熊猫的日期?,python,pandas,dataframe,pandas-groupby,Python,Pandas,Dataframe,Pandas Groupby,我有一个包含四列的数据框架:名称、帐户、日期和点 我需要按姓名和帐户分组,然后用前几天的分数填写缺少的日期 我知道怎么做,但我不知道怎么快速做。我的实际数据帧是数百万行 下面是这个问题的简化版本。我希望获得相同的输出,但在填充大量数据时,使输出速度更快 (实际数据来自Excel文件。) 以下是输出: name account date points 0 Fred g21 2014-02-02 17 1 Fred g21 2014-02-0

我有一个包含四列的数据框架:名称、帐户、日期和点

我需要按姓名和帐户分组,然后用前几天的分数填写缺少的日期

我知道怎么做,但我不知道怎么快速做。我的实际数据帧是数百万行

下面是这个问题的简化版本。我希望获得相同的输出,但在填充大量数据时,使输出速度更快

(实际数据来自Excel文件。)

以下是输出:

     name account       date points
0    Fred     g21 2014-02-02     17
1    Fred     g21 2014-02-03     17
2    Fred     g21 2014-02-04     17
3    Fred     g21 2014-02-05     17
4    Fred     g21 2014-02-06     17
5    Fred     g21 2014-02-07     17
6    Fred     g21 2014-02-08     19
7    Fred     g21 2014-02-09     19
8    Fred     g21 2014-02-10     19
9    Fred     g52 2014-02-07     21
10   Fred     g52 2014-02-08     21
11   Fred     g52 2014-02-09     18
12   Fred     g52 2014-02-10     18
13  Steve     e12 2014-02-07     17
14  Steve     e12 2014-02-08     17
15  Steve     e12 2014-02-09     18
16  Steve     e12 2014-02-10     18
17  Steve     g52 2014-02-03     52
18  Steve     g52 2014-02-04     52
19  Steve     g52 2014-02-05     52
20  Steve     g52 2014-02-06     25
21  Steve     g52 2014-02-07     25
22  Steve     g52 2014-02-08     31
23  Steve     g52 2014-02-09     40
24  Steve     g52 2014-02-10     40

我认为不在整个数据帧级别为每个组执行
part\u df.index=pd.DatetimeIndex(part\u df.date)
可以节省一些时间。然后仅在“点”列上执行
groupby
,同时执行多个操作,而不是重新分配
df
。整个行动是:

df = pd.DataFrame(lines, columns=columns)
df = (df.set_index(pd.to_datetime(df.date))
        .groupby(['name', 'account'])['points'].apply(lambda x: x.reindex(dates).ffill())
        .dropna().reset_index().rename(columns={'level_2':'date'}))

你会得到同样的结果。不确定您的大数据集的改进有多大,但在您给出的示例中,大约快了2.4倍。这可能取决于您拥有的群组数量和
日期的长度

我认为您唯一的选择是在日期范围内呼叫
groupby
reindex

def reindex(g):
    return g.reindex(pd.date_range(g.index.min(), g.index.max()))

df['date'] = pd.to_datetime(df['date'], errors='coerce')
(df.set_index('date')
   .groupby(['name', 'account'])
   .points.apply(reindex)
   .ffill()
   .rename_axis(['name', 'account', 'date'])
   .reset_index())

     name account       date points
0    Fred     g21 2014-02-02     17
1    Fred     g21 2014-02-03     17
2    Fred     g21 2014-02-04     17
3    Fred     g21 2014-02-05     17
4    Fred     g21 2014-02-06     17
5    Fred     g21 2014-02-07     17
6    Fred     g21 2014-02-08     19
7    Fred     g52 2014-02-07     21
8    Fred     g52 2014-02-08     21
9    Fred     g52 2014-02-09     18
10  Steve     e12 2014-02-07     17
11  Steve     e12 2014-02-08     17
12  Steve     e12 2014-02-09     18
13  Steve     g52 2014-02-03     52
14  Steve     g52 2014-02-04     52
15  Steve     g52 2014-02-05     52
16  Steve     g52 2014-02-06     25
17  Steve     g52 2014-02-07     25
18  Steve     g52 2014-02-08     31
19  Steve     g52 2014-02-09     40
使用:

输出:

        index   name account points
0  2014-02-02   Fred     g21     17
1  2014-02-03   Fred     g21     17
2  2014-02-04   Fred     g21     17
3  2014-02-05   Fred     g21     17
4  2014-02-06   Fred     g21     17
5  2014-02-07   Fred     g21     17
6  2014-02-08   Fred     g21     19
7  2014-02-07   Fred     g52     21
8  2014-02-08   Fred     g52     21
9  2014-02-09   Fred     g52     18
10 2014-02-07  Steve     e12     17
11 2014-02-08  Steve     e12     17
12 2014-02-09  Steve     e12     18
13 2014-02-03  Steve     g52     52
14 2014-02-04  Steve     g52     52
15 2014-02-05  Steve     g52     52
16 2014-02-06  Steve     g52     25
17 2014-02-07  Steve     g52     25
18 2014-02-08  Steve     g52     31
19 2014-02-09  Steve     g52     40

虽然我发现您的答案在如何处理数据方面有意义,但它的输出并不完全相同,例如,请参见第7行。总体而言,问题中的结果有25行,您只有20行。
df.set_index('date')\
  .groupby(['name','account'], as_index=False, group_keys=False)\
  .apply(lambda x: x.reindex(pd.date_range(x.index.min(), 
                                           x.index.max(), freq='D'))
                    .ffill())\
  .reset_index()
        index   name account points
0  2014-02-02   Fred     g21     17
1  2014-02-03   Fred     g21     17
2  2014-02-04   Fred     g21     17
3  2014-02-05   Fred     g21     17
4  2014-02-06   Fred     g21     17
5  2014-02-07   Fred     g21     17
6  2014-02-08   Fred     g21     19
7  2014-02-07   Fred     g52     21
8  2014-02-08   Fred     g52     21
9  2014-02-09   Fred     g52     18
10 2014-02-07  Steve     e12     17
11 2014-02-08  Steve     e12     17
12 2014-02-09  Steve     e12     18
13 2014-02-03  Steve     g52     52
14 2014-02-04  Steve     g52     52
15 2014-02-05  Steve     g52     52
16 2014-02-06  Steve     g52     25
17 2014-02-07  Steve     g52     25
18 2014-02-08  Steve     g52     31
19 2014-02-09  Steve     g52     40