簡體   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