繁体   English   中英

通过内插列标签从熊猫数据框中选择系列

[英]Selection of a Series from pandas dataframe by interpolating column labels

我有一个熊猫数据框,其中包含多个位置(由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对象,因此我可以在另一后处理脚本的一行(或两行)中调用它。

我认为最好自己编写一个简单的函数。 就像是:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM