通过插值列标签从pandas DataFrame中选择序列

0 投票
1 回答
631 浏览
提问于 2025-05-01 07:07

我有一个 pandas 数据框,里面包含了多个位置(通过坐标 x 定义)在不同时间点的值。我想创建一个 pandas.Series 对象,这个对象包含了在给定位置 x 的所有时间点的值(也就是数据框的所有索引值)。如果 x 不是列标签之一,我希望能在两个最近的 x 值之间进行插值。

这是数据框对象的一部分(min(x)=0max(x)=0.28):

          0.000000  0.007962  0.018313  0.031770  0.049263  0.072004
time (s)                                                               
15760800  0.500481  0.500481  0.500481  0.500481  0.500481  0.500481   
15761400  1.396126  0.487198  0.498765  0.501326  0.500234  0.500544   
15762000  1.455313  0.542441  0.489421  0.502851  0.499945  0.500597   
15762600  1.492908  0.592022  0.487835  0.502233  0.500139  0.500527   
15763200  1.521089  0.636743  0.490874  0.500704  0.500485  0.500423   
15763800  1.542632  0.675589  0.496401  0.499065  0.500788  0.500335

我可以找到通过可用列标签来切片数据框的方法。但是,有没有一种优雅的方式来进行插值呢?

最后,我想要一个看起来像这样的函数:result = sliceDataframe( dataframe=dfin,x=0.01),其中结果是一个 pandas.Series 对象,这样我就可以在另一个后处理脚本中用一行(或者两行)来调用它。

暂无标签

1 个回答

1

我觉得你最好自己写一个简单的函数。可以像这样:

def sliceDataframe(df, x):
    # supposing the column labels are sorted:
    pos = np.searchsorted(df.columns.values, x)

    # select the two neighbouring column labels:
    left = df.columns[pos-1]
    right = df.columns[pos]

    # simple interpolation
    interpolated =  df[left] + (df[right] - df[left])/(right - left) * (x - left)
    interpolated.name = x
    return interpolated

另一种选择是使用 interpolate 方法,不过你需要先添加一列包含 NaN(缺失值)的数据,并给它一个你想要的标签。
使用上面的函数:

In [105]: df = pd.DataFrame(np.random.randn(8,4))

In [106]: df.columns = df.columns.astype(float)

In [107]: df
Out[107]:
          0         1         2         3
0 -0.336453  1.219877 -0.912452 -1.047431
1  0.842774 -0.361236 -0.245771  0.014917
2 -0.974621  1.050503  0.367389  0.789570
3  1.091484  1.352065  1.215290  0.393900
4 -0.100972 -0.250026 -1.135837 -0.339204
5  0.503436 -0.764224 -1.099864  0.962370
6 -0.599090  0.908235 -0.581446  0.662604
7 -2.234131  0.512995 -0.591829 -0.046959

In [108]: sliceDataframe(df, 0.5)
Out[108]:
0    0.441712
1    0.240769
2    0.037941
3    1.221775
4   -0.175499
5   -0.130394
6    0.154572
7   -0.860568
Name: 0.5, dtype: float64

使用 interpolate 方法:

In [109]: df[0.5] = np.NaN

In [110]: df.sort(axis=1).interpolate(axis=1)
Out[110]:
        0.0       0.5       1.0       2.0       3.0
0 -0.336453  0.441712  1.219877 -0.912452 -1.047431
1  0.842774  0.240769 -0.361236 -0.245771  0.014917
2 -0.974621  0.037941  1.050503  0.367389  0.789570
3  1.091484  1.221775  1.352065  1.215290  0.393900
4 -0.100972 -0.175499 -0.250026 -1.135837 -0.339204
5  0.503436 -0.130394 -0.764224 -1.099864  0.962370
6 -0.599090  0.154572  0.908235 -0.581446  0.662604
7 -2.234131 -0.860568  0.512995 -0.591829 -0.046959

In [111]: df.sort(axis=1).interpolate(axis=1)[0.5]
Out[111]:
0    0.441712
1    0.240769
2    0.037941
3    1.221775
4   -0.175499
5   -0.130394
6    0.154572
7   -0.860568
Name: 0.5, dtype: float64

撰写回答