我有一个从2016/1/1 00:00到2018/11/25 23:00的数据帧(名称为df),每小时带有一个时间戳,object_id和一个值。数据集仅包含其中object_id具有值的行。
timestampHour object_id value
2016/1/1 00:00 1 2
2016/1/1 00:00 3 1
2016/1/1 01:00 1 1
2016/1/1 01:00 2 3
2016/1/1 02:00 2 3
2016/1/1 02:00 3 2
我想获得一个数据框,显示每个小时的所有对象ID,如果没有值,则为空值。
timestampHour object_id value
2016/1/1 00:00 1 2
2016/1/1 00:00 2 null
2016/1/1 00:00 3 1
2016/1/1 01:00 1 1
2016/1/1 01:00 2 3
2016/1/1 01:00 3 null
2016/1/1 02:00 1 null
2016/1/1 02:00 2 3
2016/1/1 02:00 3 2
我已经从时间戳创建了dateTime。并使用以下代码将它们四舍五入为小时:
df["timestamp"] = pd.to_datetime(df["result_timestamp"])
df['timestampHour'] = df['result_timestamp'].dt.round('60min')
(我不知道是否有更好的选择,但是我一直在尝试创建timestampHour行,直到12行(每个唯一的object_id我有12条),并用(在那一小时内)未使用的object_id填充那些新创建的行。但是我无法创建带有条件的空行)
我对编程还不是很陌生,也没有找到通过搜索其他帖子来解决这个问题的线索。
答案 0 :(得分:2)
使用pivot_table
和unstack
:
df.pivot_table(
index='object_id', columns='timestampHour', values='value'
).unstack().rename('value').reset_index()
timestampHour object_id value
0 2016/1/1 00:00 1 2.0
1 2016/1/1 00:00 2 NaN
2 2016/1/1 00:00 3 1.0
3 2016/1/1 01:00 1 1.0
4 2016/1/1 01:00 2 3.0
5 2016/1/1 01:00 3 NaN
6 2016/1/1 02:00 1 NaN
7 2016/1/1 02:00 2 3.0
8 2016/1/1 02:00 3 2.0
要了解其工作原理,请参阅中间的pivot_table
:
timestampHour 2016/1/1 00:00 2016/1/1 01:00 2016/1/1 02:00
object_id
1 2.0 1.0 NaN
2 NaN 3.0 3.0
3 1.0 NaN 2.0
在找不到object_id
和timestampHour
组合的值 的情况下,将NaN
添加到表中。当您使用unstack
时,这些NaN
会保留下来,从而为您提供期望的结果,并显示缺失的值。
答案 1 :(得分:0)
这也是.reindex
,具有两个级别的笛卡尔积。 This question详细介绍了针对大型数据集优化产品性能的方法。
import pandas as pd
id_cols = ['timestampHour', 'object_id']
idx = pd.MultiIndex.from_product(df[id_cols].apply(pd.Series.unique).values.T, names=id_cols)
df.set_index(id_cols).reindex(idx).reset_index()
timestampHour object_id value
0 2016/1/1 00:00 1 2.0
1 2016/1/1 00:00 3 1.0
2 2016/1/1 00:00 2 NaN
3 2016/1/1 01:00 1 1.0
4 2016/1/1 01:00 3 NaN
5 2016/1/1 01:00 2 3.0
6 2016/1/1 02:00 1 NaN
7 2016/1/1 02:00 3 2.0
8 2016/1/1 02:00 2 3.0