【发布时间】:2019-06-20 00:45:16
【问题描述】:
我有一个大数据框(400,000+ 行),如下所示:
data = np.array([
[1949, '01/01/2018', np.nan, 17, '30/11/2017'],
[1949, '01/01/2018', np.nan, 19, np.nan],
[1811, '01/01/2018', 16, np.nan, '31/11/2017'],
[1949, '01/01/2018', 15, 21, '01/12/2017'],
[1949, '01/01/2018', np.nan, 20, np.nan],
[3212, '01/01/2018', 21, 17, '31/11/2017']
])
columns = ['id', 'ReceivedDate', 'PropertyType', 'MeterType', 'VisitDate']
pd.DataFrame(data, columns=columns)
结果df:
id ReceivedDate PropertyType MeterType VisitDate
0 1949 01/01/2018 NaN 17 30/11/2017
1 1949 01/01/2018 NaN 19 NaN
2 1811 01/01/2018 16 NaN 31/11/2017
3 1949 01/01/2018 15 21 01/12/2017
4 1949 01/01/2018 NaN 20 NaN
5 3212 01/01/2018 21 17 31/11/2017
我想根据 groupby(id 和接收日期)向前填充 - 仅当它们在索引中按顺序排列时(即仅向前填充索引位置 1 和 4)。
我正在考虑有一个列说明是否应该根据标准填充,但我如何检查上面的行?
(我计划按照这个答案使用解决方案:pandas fill forward performance issue
df.isnull().astype(int)).groupby(level=0).cumsum().applymap(lambda x: None if x == 0 else 1)
因为x = df.groupby(['id','ReceivedDate']).ffill() 很慢。)
所需的df:
id ReceivedDate PropertyType MeterType VisitDate
0 1949 01/01/2018 NaN 17 30/11/2017
1 1949 01/01/2018 NaN 19 30/11/2017
2 1811 01/01/2018 16 NaN 31/11/2017
3 1949 01/01/2018 15 21 01/12/2017
4 1949 01/01/2018 15 20 01/12/2017
5 3212 01/01/2018 21 17 31/11/2017
【问题讨论】:
-
df.groupby(['id', 'ReceivedDate']).ffill(limit=1)? -
有时我可以连续有 2 行,我试图避免
df.groupby.ffill因为每 1000 行需要大约 1 秒(太慢)。 -
但是由于您限制了前向填充的数量,它可能会变得更快吗?
-
不幸的是还不够,仅在 10,000 行上进行了测试。
ffill()= 11.2 秒,ffill(limit=1)= 11.1 秒。