Pandas dataframe.resample std仅在某些列上?

时间:2017-12-07 16:03:42

标签: python pandas dataframe

我正在尝试计算我的数据的每月标准偏差。

我的数据从数据库加载到具有以下列的数据框中:

measurement_time, level, mixing_ratio, concentration

要计算每月标准偏差,我会执行以下操作:

    df_std = df_std.set_index('measurement_time')
    df_std = df_std.groupby(['level'], as_index=False)
    df_std = df_std.resample('M').std()

结果是:

>> df_std.head()
                    level  mixing_ratio  concentration
  measurement_time                                    
0 2016-01-31          0.0  3.435376e-11       0.000015
  2016-02-29          0.0  2.692636e-11       0.000012
  2016-03-31          0.0  6.709993e-11       0.000029
  2016-04-30          0.0  3.338249e-11       0.000014
  2016-05-31          0.0  3.916523e-11       0.000017

问题在于它正在计算level上的标准差,而我只想在mixing_ratio&上进行计算。 concentration

结果应该是每个级别的每月标准偏差。如果我有7个级别,我希望我的数据帧有84行(7 * 12个月)。

我该如何解决这个问题?

2 个答案:

答案 0 :(得分:0)

重新采样时,您必须对汇总数据执行某些操作。

不同列的不同功能示例:

df_resample = df_std.resample('M').agg({'level': np.mean, 'mixing_ratio': np.std, 'concentration':np.std})

其他选项是按时间和级别分组。

答案 1 :(得分:0)

SamuelNLP的答案非常适合在DataFrame上进行不同计算的情况,如他的示例所示!

但是我有一个与pookie非常相似的问题,一个大型的DataFrame(长度> 120'000'000),我需要每5分钟除一栏外的所有std。在这种特定情况下,有一个简单但较快的替代方法:

data_std = data.resample('5min').std()
data_std.drop('temperature', axis=1)

我只是在重新采样后计算了std,然后删除了我不需要的列。

>> data.head()
                                 x      y        z  temperature
time                
2018-02-21 11:00:06.354      0.606  0.764   -0.499  21.163203
2018-02-21 11:00:06.364     -0.762  0.127   -0.499  21.163203
2018-02-21 11:00:06.374     -0.793  0.143   -0.482  21.163203
2018-02-21 11:00:06.384     -0.809  0.064   -0.418  21.163203
2018-02-21 11:00:06.394     -0.825  -0.016  -0.401  21.163203

>> data_std = data.resample('5min').std()
>> data_std.drop('temperature', axis=1)
>> data_std.head()
                               x           y           z
time            
2018-02-21 11:00:05     0.260700    0.192227    0.244653
2018-02-21 11:00:10     0.125168    0.164327    0.116562
2018-02-21 11:00:15     0.138330    0.154963    0.126264
2018-02-21 11:00:20     0.182339    0.204350    0.226019
2018-02-21 11:00:25     0.193661    0.107022    0.133125

加速: 我用不同的DataFrame长度对这两个选项进行了测试,分别用一次简单的time.time()测量了50次。

# resample-drop method
tmp = data.resample('5s').std()
tmp.drop('temperature', axis=1, inplace=True)

# aggregate method
tmp = data.resample('5s').agg({'x': np.std, 'y':np.std, 'z':np.std})

重采样删除方法比聚合方法快20%-25%。 Runtime of two methods, 50 reruns

我认为此运行时差异是由于与聚合相比,简单的重采样部分的更有效实现。但我很乐意提供更多解释。