Reindex Pandas并插入一个numpy数组的零

时间:2017-07-22 19:43:20

标签: python pandas numpy reindex

我有一个pandas数据帧df

    Date                Activity Vector
0   2017-03-01T15:20:00 [0.0366666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
1   2017-03-01T15:25:00 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
2   2017-03-01T15:45:00 [0.163333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
3   2017-03-01T15:50:00 [0.316666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
4   2017-03-01T15:55:00 [0.0666666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
5   2017-03-01T16:00:00 [0.123333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
6   2017-03-01T16:05:00 [0.0333333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
7   2017-03-01T16:10:00 [0.356666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
8   2017-03-01T16:15:00 [0.476666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
9   2017-03-01T16:20:00 [0.113333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
10  2017-03-01T16:50:00 [0.0733333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...

此数据是包含一些缺失值的时间序列(请注意,Date列的类型为str)。

我想重新索引此数据框并使用numpy向量填充缺少的条目np.zeros(15)

我尝试过以下方法:

df = data.clean_df[['Date', 'Activity Vector']]
df['timestamp'] = pd.to_datetime(df['Date'])
# print(df.dtypes)
df = df.set_index('timestamp').resample('300S').ffill()

给了我以下内容:

    timestamp           Date                Activity Vector
0   2017-03-01 15:20:00 2017-03-01T15:20:00 [0.0366666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
1   2017-03-01 15:25:00 2017-03-01T15:25:00 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
2   2017-03-01 15:30:00 2017-03-01T15:25:00 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
3   2017-03-01 15:35:00 2017-03-01T15:25:00 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
4   2017-03-01 15:40:00 2017-03-01T15:25:00 [0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, ...
5   2017-03-01 15:45:00 2017-03-01T15:45:00 [0.163333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
6   2017-03-01 15:50:00 2017-03-01T15:50:00 [0.316666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
7   2017-03-01 15:55:00 2017-03-01T15:55:00 [0.0666666666667, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
8   2017-03-01 16:00:00 2017-03-01T16:00:00 [0.123333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0,...
9   2017-03-01 16:05:00 2017-03-01T16:05:00 [0.0333333333333, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0...
10  2017-03-01 16:10:00 2017-03-01T16:10:00 [0.356666666667, 0.0, 0.0, 0.0, 

然而,这会通过ffill填充上一个条目中缺少的样本,如何使用自定义条目填充新行,例如Date为任何内容(无关紧要)因为它将在稍后删除)但Activity Vector填充了一个零的向量,np.zeros(15)

1 个答案:

答案 0 :(得分:1)

由于您说Date being anything (doesn't matter as it will be dropped later),而不是ffill,您可以使用asfreq,然后使用所需的列表或字符串填充NaN数据。

如果你想将numpy数组作为字符串,你可以使用str。如果您希望将数组作为示例列表,则可以使用ast.literal_eval()

import ast
df['timestamp'] = pd.to_datetime(df['Date'])
# print(df.dtypes)
df = df.set_index('timestamp').resample('300S').asfreq()
df['Activity Vector'] = df['Activity Vector'].fillna(str(np.zeros(15).tolist())).apply(str)
df['Activity Vector'] = df['Activity Vector'].apply(ast.literal_eval)

希望这会有所帮助。