我有一个数据帧,其中有一些ID,每个ID都有一些值和时间戳(连续5到7天,每5分钟大约一个值)。我想为每个小时和每个ID选择该小时中值的平均值,中位数和方差,并将它们存储在不同的列中,如下所示:
hour mean var median ID
0 2 4 4 1234
1 4 5 3 1234
...
23 2 2 3 1234
我的专栏是:
ID int64
Value float64
Date datetime64[ns]
dtype: object
我的时间戳是以下类型:
%Y-%m-%d %H:%M:%S.%f
如何为每个ID创建最终数据框?非常感谢
编辑:
在下面的行中,我用小时正确创建了一个列:
df['hour'] = df.Date.dt.hour
现在的问题是,我的小时数很长,相同,并且如果我使用这样的重采样:
df = df.set_index('Date').resample('60T').mean().reset_index()
它会自动删除值列并覆盖平均值。我想保留这些列,以便我可以基于“值”列中的值为均值,方差和中位数创建不同的列。我该怎么做?
答案 0 :(得分:1)
尝试一下:
# Extract the hour from the Date column
h = df['Date'].dt.hour.rename('Hour')
# Group by ID and Hour
df.groupby(['ID', h]).agg({
'Value': ['mean', 'var', 'median']
})
您可以将h
系列替换为pd.Grouper
。默认情况下,pd.Grouper
对索引进行分组。您可以设置key
参数,使其定位到另一列:
df.groupby([pd.Grouper('1H', key='Date'), 'ID').agg({
'Value': ['mean', 'var', 'median']
})