熊猫,结合多个数据帧

时间:2015-04-09 14:52:04

标签: python csv pandas

我有一个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

我现在正尝试将df3df4合并到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

1 个答案:

答案 0 :(得分:1)

要使用transform从组中添加聚合列,这将返回与原始df对齐的系列:

df2['AVG_HR'] = df2.groupby(df2.index.map(lambda t: t.hour))['avg_hr'].transofrm('mean')

同样没有必要使用lambda来按小时组合索引,如果它是一个DateTimeindex具有可以直接访问的日期时间属性,那么上面的内容可以简化为:

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