通过插入列标签从pandas数据帧中选择系列

时间:2014-11-03 11:29:58

标签: python pandas

我有一个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对象,所以我可以在另一个后处理脚本中用一行(或两个)来调用它。 / p>

1 个答案:

答案 0 :(得分: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