【发布时间】:2015-04-09 14:52:03
【问题描述】:
我有一个执行以下操作的 python 程序。
- 读取 .csv
- 使用来自 csv 特定列的值创建一个数据框
- 从 unix 时间戳转换时间戳
- 按小时对数据进行分组,然后查找该小时内某些数据的平均值。
代码:
df = pd.read_csv(files,parse_dates=True)
df2 = df[['timestamp','avg_hr','avg_rr','emfit_sleep_summary_id']]
df2['timestamp'] = df2['timestamp'].astype(int)
df2['timestamp'] = pd.to_datetime(df2['timestamp'],unit='s')
df2 = df2.set_index('timestamp')
df3 = df2.groupby(df2.index.map(lambda t: t.hour))['avg_hr'].mean()
df4 = df2.groupby(df2.index.map(lambda t: t.hour))['avg_rr'].mean()
print df3
print df4
样本输出:
timestamp avg_hr avg_rr emfit_sleep_summary_id
0 2015-01-28 08:14:50 101 6.4 78
1 2015-01-28 08:14:52 98 6.4 78
2 2015-01-28 00:25:00 60 0.0 78
3 2015-01-28 00:25:02 63 0.0 78
4 2015-01-28 07:24:06 79 11.6 78
5 2015-01-28 07:24:08 79 11.6 78
0 99.5
7 61.5
8 78.5
Name: avg_hr, dtype: float64
0 0.000
7 11.725
8 6.400
Name: avg_rr, dtype: float64
我现在尝试将 df3 和 df4 合并到 df2 中,因此结果将如下所示:
timestamp avg_hr avg_rr emfit_sleep_summary_id AVG_HR AVG_RR
0 2015-01-28 08:14:50 101 6.4 78 99.5 6.4
1 2015-01-28 08:14:52 98 6.4 78 99.5 6.4
2 2015-01-28 00:25:00 60 0.0 78 61.5 0.0
3 2015-01-28 00:25:02 63 0.0 78 61.5 0.0
4 2015-01-28 07:24:06 79 11.6 78 78.5 11.6
5 2015-01-28 07:24:08 79 11.6 78 78.5 11.6
我尝试了以下操作
df2['AVG_HR'] = df2.groupby(df2.index.map(lambda t: t.hour))['avg_hr'].mean()
但是当我运行时,它为整个列返回了NAN。
编辑:我还知道如何将行数减少到每小时一个,而不是每小时 2 个。
timestamp avg_hr avg_rr emfit_sleep_summary_id AVG_HR AVG_RR
0 2015-01-28 08:14:50 101 6.4 78 99.5 6.4
1 2015-01-28 00:25:00 60 0.0 78 61.5 0.0
2 2015-01-28 07:24:06 79 11.6 78 78.5 11.6
【问题讨论】:
-
我想你想要的是这个:
df2['AVG_HR'] = df2.groupby(df2.index.map(lambda t: t.hour))['avg_hr'].transofrm('mean')你能确认一下 -
另外,您不需要 lambda 来按小时分组:
df3 = df2.groupby(df2.index.hour)['avg_hr'].mean() -
@EdChum 有效,如果您可以将其发布为答案,我会接受。另外,想知道有没有办法减少行数?而不是每个时间戳有 2 个,我可以只有一个吗?
-
所以您想将
df2减少到每小时一行?在哪种情况下,您想要聚合列的平均值还是总和?df2.groupby(df2.index.hour).mean().reset_index()应该将 df 压缩到每小时一次,您也可以重新采样 -
是的,我每小时需要一个,而不是 2 个时间戳。我希望平均值保持不变。请查看编辑。