【问题标题】:Resample pandas dataframe only knowing result measurement count仅知道结果测量计数对 pandas 数据帧进行重新采样
【发布时间】:2013-12-05 03:43:14
【问题描述】:

我有一个如下所示的数据框:

Trial    Measurement    Data
    0              0      12 
                   1       4
                   2      12
    1              0      12
                   1      12
    2              0      12
                   1      12
                   2     NaN
                   3      12

我想重新采样我的数据,以便每次试验只有两个测量值 所以我想把它变成这样:

Trial    Measurement    Data
    0              0       8 
                   1       8
    1              0      12
                   1      12
    2              0      12
                   1      12

这个相当少见的任务源于我的数据在刺激呈现部分存在故意抖动。

我知道 pandas 有一个重采样功能,但我不知道如何将它应用到我的二级索引,同时根据一级索引将数据保持在离散类别中:(

另外,我想迭代我的一级索引,但显然

for sub_df in np.arange(len(df['Trial'].max()))

不起作用,因为'Trial' 是一个索引,pandas 无法找到它。

【问题讨论】:

  • 如何 (0, 1) 变为 8 而不是 12 但 (2,1) 变为 6(将 NaN 视为零而不是缺失数据)?你的重采样规则是什么?前半部分数据的均值和后半部分的均值,允许重叠,设置NaN为0?
  • 我没有必须遵守的预定义重采样规则。我给出了这个例子,因为它看起来很直观。然而,确实,最好将 NaN 视为缺失数据。由于重叠,第一个值变为 8,是的。我仍然认为这是最好的方法。每次试验我有大约 256 个值,所以一个值重叠在任何情况下都不会产生任何影响。
  • 你是否需要这样索引它,它可能更容易作为列并使用groupby
  • 不,实际上我是这样编入索引的,认为这会让事情变得更容易:-/

标签: python pandas time-series resampling multi-index


【解决方案1】:

嗯,这不是我见过的最漂亮的,但从一个框架看起来像

>>> df
   Trial  Measurement  Data
0      0            0    12
1      0            1     4
2      0            2    12
3      1            0    12
4      1            1    12
5      2            0    12
6      2            1    12
7      2            2   NaN
8      2            3    12

然后我们可以手动构建两个“平均类”对象,然后使用pd.melt 重塑输出:

avg = df.groupby("Trial")["Data"].agg({0: lambda x: x.head((len(x)+1)//2).mean(), 
                                       1: lambda x: x.tail((len(x)+1)//2).mean()}) 
result = pd.melt(avg.reset_index(), "Trial", var_name="Measurement", value_name="Data")
result = result.sort("Trial").set_index(["Trial", "Measurement"])

产生

>>> result

                   Data
Trial Measurement      
0     0               8
      1               8
1     0              12
      1              12
2     0              12
      1              12

【讨论】:

  • 我可以使它更通用,以便它执行这些操作而不仅仅是“数据”?我实际上有 11 个数据列 ^^
猜你喜欢
  • 2017-09-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2013-11-22
  • 2020-11-29
相关资源
最近更新 更多