我有一个以下通用格式的数据框:
id,transaction_dt,units,measures
1,2018-01-01,4,30.5
1,2018-01-03,4,26.3
2,2018-01-01,3,12.7
2,2018-01-03,3,8.8
我想要完成的是堆叠并枚举' transaction_dt'基于'单位'的价值在同一记录中的字段并将它们展开到新记录中以生成如下内容:
id,transaction_dt,measures
1,2018-01-01,30.5
1,2018-01-02,30.5
1,2018-01-03,30.5
1,2018-01-04,30.5
1,2018-01-03,26.3
1,2018-01-04,26.3
1,2018-01-05,26.3
1,2018-01-06,26.3
2,2018-01-01,12.7
2,2018-01-02,12.7
2,2018-01-03,12.7
2,2018-01-03,8.8
2,2018-01-04,8.8
2,2018-01-05,8.8
我一直在努力创建一个矢量化的高性能版本,回答我先前的问题,有人在此回答: Python PANDAS: Stack and Enumerate Date to Create New Records
df.set_index('transaction_dt', inplace=True)
df.apply(lambda x: pd.Series(pd.date_range(x.name, periods=x.units)), axis=1). \
stack(). \
reset_index(level=1). \
join(df['measure']). \
drop('level_1', axis=1). \
reset_index(). \
rename(columns={0:'enumerated_dt'})
这确实有效但我有一个非常大的数据集来运行它,所以我需要投入更多优化它。他建议创建一个包含所有日期的数组,我可以用这样的东西来做:
date_range = pd.date_range('2004-01-01', '2017-12-31', freq='1D')
他建议然后重新索引数组并以某种方式向前填充值。如果有人能帮助我,我会真诚地感激它!
答案 0 :(得分:3)
对于重复行,您可以使用numpy.repeat
列units
和loc
的重复索引。最后每个索引按cumcount
获得count
,转换为to_timedelta
并添加到列transaction_dt
。最后reset_index
表示默认的唯一标注:
df = df.loc[np.repeat(df.index, df['units'])]
df['transaction_dt'] += pd.to_timedelta(df.groupby(level=0).cumcount(), unit='d')
df = df.reset_index(drop=True)
print (df)
id transaction_dt units measures
0 1 2018-01-01 4 30.5
1 1 2018-01-02 4 30.5
2 1 2018-01-03 4 30.5
3 1 2018-01-04 4 30.5
4 1 2018-01-03 4 26.3
5 1 2018-01-04 4 26.3
6 1 2018-01-05 4 26.3
7 1 2018-01-06 4 26.3
8 2 2018-01-01 3 12.7
9 2 2018-01-02 3 12.7
10 2 2018-01-03 3 12.7
11 2 2018-01-03 3 8.8
12 2 2018-01-04 3 8.8
13 2 2018-01-05 3 8.8