Python 如何加快填写熊猫的日期?
我有一个包含四列的数据框架:名称、帐户、日期和点 我需要按姓名和帐户分组,然后用前几天的分数填写缺少的日期 我知道怎么做,但我不知道怎么快速做。我的实际数据帧是数百万行 下面是这个问题的简化版本。我希望获得相同的输出,但在填充大量数据时,使输出速度更快 (实际数据来自Excel文件。) 以下是输出: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
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