【发布时间】:2019-09-30 03:00:23
【问题描述】:
我有一个包含多个组的大型数据集,其中包含两列开始和结束日期以及一个值列(每个组可以有多个值) 我想有效地扩展它并获得一个新的数据框,它有时间(以秒为单位)作为每个组的索引和列,每个组将在其中存储值
数据如下:
import pandas as pd
import datetime as dt
import numpy as np
df = pd.DataFrame()
df['start'] = [dt.datetime(2017, 4, 3,5,22,21), dt.datetime(2017, 4, 5,3,51,22),\
dt.datetime(2017, 4, 4,4,23,33),dt.datetime(2017, 4, 3,7,28,45),\
dt.datetime(2017, 4, 6,5,22,24),dt.datetime(2017, 4, 6,5,22,56)]
df['end'] = [dt.datetime(2017, 4, 3,6,33,23), dt.datetime(2017, 4,5,3,52,46),\
dt.datetime(2017, 4,4,4,58,12),dt.datetime(2017, 4, 4,1,23,34),\
dt.datetime(2017, 4, 7,5,22,24),dt.datetime(2017, 4, 7,5,22,47)]
df['group'] = ['1', '2', '3','1','2','3']
df['value'] = ['a', 'b', 'c','b','c','a']
start end group value
0 2017-04-03 05:22:21 2017-04-03 06:33:23 1 a
1 2017-04-05 03:51:22 2017-04-05 03:52:46 2 b
2 2017-04-04 04:23:33 2017-04-04 04:58:12 3 c
3 2017-04-03 07:28:45 2017-04-04 01:23:34 1 b
4 2017-04-06 05:22:24 2017-04-03 05:22:24 2 c
5 2017-04-03 05:22:56 2017-04-03 05:22:47 3 a
我尝试了以下方法:
构造一个新的数据帧,索引在最早开始和最晚结束的范围内。
按 group_ID 分组
遍历组行,从每一行创建一个小的数据框,索引在行的开始日期和行的结束日期存储行的值
4.将同一组中的小数据帧连接成一个数据帧
- 将组数据框(实际上是日期索引上的一列值)加入(左连接)到大数据框(将其添加为列)
这里是sn-p:
def turn_deltas(row,col):
key = str(row['group'])
df = pd.DataFrame(index=pd.date_range(row['start'], row['end'], freq="1S"))
df[key] = row[col]
return df
grouped = df.groupby("group")
data = pd.DataFrame(index=pd.date_range(df['start'].min(), df['end'].max(), freq="1s"))
for name, group in (grouped):
for i, row in enumerate(group.iterrows()):
if i == 0:
df_2 = turn_deltas(row[1],"value")
else:
df_2 = pd.concat([df_2, turn_deltas(row[1],"value")], axis=0)
data = data.merge(df_2, how="left", left_index=True, right_index=True)
print (data)
我的代码正在运行,但执行任务非常(非常)慢
最后,我得到了这个更新的数据框:
2017-04-03 05:22:21 a NaN NaN
2017-04-03 05:22:22 a NaN NaN
2017-04-03 05:22:23 a NaN NaN
2017-04-03 05:22:24 a NaN NaN
2017-04-03 05:22:25 a NaN NaN
2017-04-03 05:22:26 a NaN NaN
2017-04-03 05:22:27 a NaN NaN
2017-04-03 05:22:28 a NaN NaN
2017-04-03 05:22:29 a NaN NaN
2017-04-03 05:22:30 a NaN NaN
2017-04-03 05:22:31 a NaN NaN
2017-04-03 05:22:32 a NaN NaN
2017-04-03 05:22:33 a NaN NaN
2017-04-03 05:22:34 a NaN NaN
2017-04-03 05:22:35 a NaN NaN
2017-04-03 05:22:36 a NaN NaN
2017-04-03 05:22:37 a NaN NaN
2017-04-03 05:22:38 a NaN NaN
2017-04-03 05:22:39 a NaN NaN
2017-04-03 05:22:40 a NaN NaN
2017-04-03 05:22:41 a NaN NaN
2017-04-03 05:22:42 a NaN NaN
2017-04-03 05:22:43 a NaN NaN
2017-04-03 05:22:44 a NaN NaN
2017-04-03 05:22:45 a NaN NaN
2017-04-03 05:22:46 a NaN NaN
2017-04-03 05:22:47 a NaN NaN
2017-04-03 05:22:48 a NaN NaN
2017-04-03 05:22:49 a NaN NaN
2017-04-03 05:22:50 a NaN NaN
... ... ... ...
2017-04-07 05:22:18 NaN c a
2017-04-07 05:22:19 NaN c a
2017-04-07 05:22:20 NaN c a
2017-04-07 05:22:21 NaN c a
2017-04-07 05:22:22 NaN c a
2017-04-07 05:22:23 NaN c a
2017-04-07 05:22:24 NaN c a
2017-04-07 05:22:25 NaN NaN a
2017-04-07 05:22:26 NaN NaN a
2017-04-07 05:22:27 NaN NaN a
2017-04-07 05:22:28 NaN NaN a
2017-04-07 05:22:29 NaN NaN a
2017-04-07 05:22:30 NaN NaN a
2017-04-07 05:22:31 NaN NaN a
2017-04-07 05:22:32 NaN NaN a
2017-04-07 05:22:33 NaN NaN a
2017-04-07 05:22:34 NaN NaN a
2017-04-07 05:22:35 NaN NaN a
2017-04-07 05:22:36 NaN NaN a
2017-04-07 05:22:37 NaN NaN a
2017-04-07 05:22:38 NaN NaN a
2017-04-07 05:22:39 NaN NaN a
2017-04-07 05:22:40 NaN NaN a
2017-04-07 05:22:41 NaN NaN a
2017-04-07 05:22:42 NaN NaN a
2017-04-07 05:22:43 NaN NaN a
2017-04-07 05:22:44 NaN NaN a
2017-04-07 05:22:45 NaN NaN a
2017-04-07 05:22:46 NaN NaN a
2017-04-07 05:22:47 NaN NaN a
注意:
这段代码只是整个项目的一部分。
执行此转换后,我还使用 get_dummies() 为每列的每个值获取一个单独的列,以便您也可以将其纳入您的实施策略
谢谢!
【问题讨论】:
标签: python pandas date pandas-groupby processing-efficiency