2014-11-03 112 views
0

我有一个熊猫数据框,包含多个位置(由坐标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

我觉得你最好自己写一个简单的函数。喜欢的东西:

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 
+0

我不想和一个虚构的点来调整数据帧。有没有办法在不添加列的情况下使用插值选项?如果不是,那么我想我会选择第一个解决方案。 – tvandenbrande 2014-11-03 15:09:41

+0

不,熊猫插值方法始终填充DataFrame中的NaN。但也许有可能使用基本的scipy插值方法。但是,一旦您选择了两个相邻的列,插值本身只是一条简单的线性插值线,我不知道这是值得使用的。 – joris 2014-11-03 15:12:21

+0

实现了第一个选项,工作正常,速度足以进行后期处理。谢谢 – tvandenbrande 2014-11-03 15:18:10