熊猫DataFrame重新索引到最近

时间:2018-10-16 17:04:40

标签: python pandas numpy

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

统一列采样

想象一下以下数据集:

         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

两个问题。

2 个答案:

答案 0 :(得分:2)

您可以按列重新索引,预先删除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
)

答案 1 :(得分:1)

问题是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