我有一个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
最佳答案
要使用transform
从groupby添加聚合列,这将返回与原始df对齐的Series:
df2['AVG_HR'] = df2.groupby(df2.index.map(lambda t: t.hour))['avg_hr'].transofrm('mean')
另外,也不必使用lambda来对小时进行分组,如果索引是DateTimeindex,则具有可以直接访问的datetime属性,因此上述内容可以简化为:
df2['AVG_HR'] = df2.groupby(df2.index.hour)['avg_hr'].transform('mean')
如果要按小时重新采样,可以按小时分组,然后调用
reset_index
:In [17]:
df.groupby(df.index.hour).mean().reset_index()
Out[17]:
index avg_hr avg_rr emfit_sleep_summary_id
0 0 61.5 0.0 78
1 7 79.0 11.6 78
2 8 99.5 6.4 78
关于python - Pandas ,组合多个数据框,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/29541892/