2014-11-03 105 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