2017-07-03 8 views
2

との間隔によって、私は次のようになります(ボーリング孔からの)長さ間隔データのデータフレームがあります分割長(メートル)のデータパンダ

df 
Out[46]: 
    from to min intensity 
0  0 10 py  2 
1  5 15 cpy  3.5 
2 14 27 spy  0.7 

を私はこのデータをピボットする必要がありますが、またそれを破ります少なくとも共通の長さ間隔で;カラムヘッダーとして 'min'カラムが得られ、値は 'rank'になります。あなたが見ることができるように - そう、基本的には「から」との間隔は、少なくとも共通分母によって分割されたボーリング孔を、非重複区間をダウン記述する「を」

df.somefunc(index=['from','to'], columns='min', values='intensity', fill_value=0) 
Out[47]: 
    from to py cpy spy 
0  0 5 2 0 0 
1  5 10 2 3.5 0 
2 10 14 0 3.5 0 
3 14 15 0 3.5 0.7 
4 15 27 0 0 0.7 

:出力は次のようになります。最初の(0-5m)からpy:2、cpy:0まで、そして第2の(5-10m)からpy:2、cpy:3.5に分割されています。ちょうどからインデックスとして組み合わさ列に扱い

pd.pivot_table(df, values='intensity', index=['from', 'to'], columns="min", aggfunc="first", fill_value=0) 
Out[48]: 
min  cpy py spy 
from to    
0 10 0 2 0 
5 15 3.5 0 0 
14 27 0 0 0.75 

だけ基本pivot_table関数からの結果は、このです。重要な点は、私の出力は値との間で重なり合うことができないということです(IEは後続の 'from'値が前の 'to'値より小さくてはいけません)。

パンダを使用してこれを実現するエレガントな方法はありますか?助けてくれてありがとう!

答えて

1

私はパンダの自然区間算術を知らないので、それをする必要があります。 これを行う方法は、私は正しくバインドされた条件を理解している場合。 これはO(n^3)の問題であり、大きなエントリのために巨大なテーブルを作成します。

# make the new bounds 
bounds=np.unique(np.hstack((df["from"],df["to"]))) 
df2=pd.DataFrame({"from":bounds[:-1],"to":bounds[1:]}) 

#find inclusions 
isin=df.apply(lambda x : 
df2['from'].between(x[0],x[1]-1) 
| df2['to'].between(x[0]+1,x[1]) 
,axis=1).T 

#data 
data=np.where(isin,df.intensity,0) 

#result 
df3=pd.DataFrame(data, 
pd.MultiIndex.from_arrays(df2.values.T),df["min"]) 

In [26]: df3 
Out[26]: 
min  py cpy spy 
0 5 2.0 0.0 0.0 
5 10 2.0 3.5 0.0 
10 14 0.0 3.5 0.0 
14 15 0.0 3.5 0.7 
15 27 0.0 0.0 0.7 
+0

うわー、それはその後、私はそれを取るだろうと思った実際に多くのコードが少ないラインです。どうもありがとう!!! –

関連する問題