【问题标题】:Pandas DataFrame reindex to nearestPandas DataFrame 重新索引到最近
【发布时间】:2019-03-21 06:58:29
【问题描述】:

我在下面添加了一个“非均匀列抽样”案例。

统一列抽样

想象以下数据集:

         x    y
t              
0.010  1.0  NaN
0.015  NaN  5.0
0.022  3.0  NaN
0.023  NaN  4.0
0.031  5.0  NaN
0.032  NaN  7.0

目标是将这些数据重新索引到一个共同的采样间隔并关联最近的采样点。即返回:

         x    y
t              
0.01  1.0  5.0
0.02  3.0  4.0
0.03  5.0  7.0

我尝试使用 pandas DataFrame.reindex 方法。但是,它似乎不起作用。这是一个例子:

import pandas as pd
import numpy as np

data_dict = {'t':[0.01  , 0.015 , 0.022 , 0.023 , 0.031 , 0.032],
             'x':[   1  , np.nan, 3     , np.nan, 5     , np.nan],
             'y':[np.nan, 5     , np.nan, 4     , np.nan, 7] }
df = pd.DataFrame(data_dict)
df.set_index('t', inplace=True)
df.reindex([0.01, 0.02, 0.03], method='nearest', tolerance=0.01)

结果是:

        x   y
t            
0.01  1.0 NaN
0.02  3.0 NaN
0.03  5.0 NaN

我的问题是:

  1. 这是 reindex 方法的预期用例吗
  2. 如何实现?

非均匀列抽样

想象一下这个数据集:

         x    y
t              
0.010  1.0  NaN
0.022  3.0  NaN
0.023  NaN  5.0
0.031  5.0  NaN
0.039  NaN  7.0
0.041  4.0  NaN

在这种情况下,列的采样频率确实不同,但我们希望将它们重新索引到一个共同的时间尺度。如何应用 reindex 来获得以下信息:

         x    y
t              
0.010  1.0  NaN
0.020  3.0  5.0
0.030  5.0  NaN
0.040  4.0  7.0

同样的两个问题。

【问题讨论】:

  • 你有公差=0.01,这就是为什么 y 是 nan
  • @Wen,无论公差值如何,问题仍然存在。实际上,我相信预期的效用是首先应用“fillna()”,然后执行“reindex()”。现在发生的是它正在重新索引,但找到最接近的值是 NAN。但是如果你先“fillna()”,你会失去'x'和'y'列之间的任何可变采样率(尽管这个例子没有说明这一点)。
  • @Hamid 在您更新的示例中,0.03 的 y 列的值在公差范围内,即 0.023 -> 5.0,那么您为什么在重新索引后期望 NaN?
  • @a_guest,我认为因为y 的输出实际上应该只在[0.02, 0.04] 上重新索引,而NaN 是将DataFrames 连接在一起的结果。
  • @ALollz 有道理,谢谢。

标签: python pandas numpy


【解决方案1】:

您可以对每列进行重新索引,预先删除 NaN,然后​​将这些部分重新组合在一起:

t = [0.01, 0.02, 0.03]
df2 = pd.concat(
    map(lambda c: df[c].dropna().reindex(t, method='nearest', tolerance=0.01),
        df.columns),
    axis=1
)

【讨论】:

    【解决方案2】:

    问题在于NaN 值是y 列中最接近的匹配项,因此它正在选择它们。您可以先进行插值以适当地填充 NaN 值,然后重新索引。

    df.interpolate(method='nearest').ffill().bfill().reindex([0.01, 0.02, 0.03], method='nearest')
    
            x    y
    t             
    0.01  1.0  5.0
    0.02  3.0  4.0
    0.03  5.0  7.0
    

    【讨论】:

    • 谢谢!如果'x'和'y'不同的采样率呢?例如,“x”每 0.01 个时间间隔采样一次,但“y”每 0.02 个时间间隔存在一次?也许我会更新这个问题。
    • 我用第二个示例数据集更新了这个问题,其中采样间隔不同。我认为同样的解决方案不会奏效。一旦应用填充方法,我们就会丢失“y”列的原始采样间隔。
    • @Hamid,我明白了。在这种情况下,我认为您应该使用@a_guest 提供的解决方案。您只需将 t 更改为字典,并为每一列指定索引。
    猜你喜欢
    • 2013-09-23
    • 2012-10-09
    • 2017-08-07
    • 1970-01-01
    • 1970-01-01
    • 2013-11-19
    • 2018-05-04
    相关资源
    最近更新 更多