2016-11-04 15 views
1

本当に簡単な解決策があると確信しています。しかし...パンダのデータフレームを別のデータフレームの値のリストで分割する

私は高周波データのデータフレームを持っています。 Aのタイムスタンプ列がB [0]とB [1の間にある場合、1を表示する列にAを追加したいと思います。 ]、B [1]とB [2]の間にある場合は2などとなります。

これはおそらく信じられないほど些細なことであり、私は今この1時間後にそれを実現していないだけです。

答えて

2

ここでは、リストの理解を使用して迅速かつ汚いアプローチです。

>>> df = pd.DataFrame({'A': np.arange(1, 3, 0.2)}) 

>>> A = df.A.values.tolist() 
A: [1.0, 1.2, 1.4, 1.6, 1.8, 2.0, 2.2, 2.5, 2.6, 2.8] 

>>> B = np.arange(0, 3, 1).tolist() 
B: [0, 1, 2] 

>>> BA = [k for k in range(0, len(B)-1) for a in A if (B[k]<=a) & (B[k+1]>a) or (a>max(B))] 
BA: [0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1] 
2

使用searchsortedA['timestamp']の各値に対して

A['group'] = B['timestamp'].searchsorted(A['timestamp']) 

は、インデックス値が返されます。このインデックスは、ソートされた順序を維持するために、のソートされた値のうち、Aの値がBに挿入される場所を示します。例えば

import numpy as np 
import pandas as pd 
np.random.seed(2016) 

N = 10 
A = pd.DataFrame({'timestamp':np.random.uniform(0, 1, size=N).cumsum()}) 
B = pd.DataFrame({'timestamp':np.random.uniform(0, 3, size=N).cumsum()}) 
# timestamp 
# 0 1.739869 
# 1 2.467790 
# 2 2.863659 
# 3 3.295505 
# 4 5.106419 
# 5 6.872791 
# 6 7.080834 
# 7 9.909320 
# 8 11.027117 
# 9 12.383085 

A['group'] = B['timestamp'].searchsorted(A['timestamp']) 
print(A) 

収率

timestamp group 
0 0.896705  0 
1 1.626945  0 
2 2.410220  1 
3 3.151872  3 
4 3.613962  4 
5 4.256528  4 
6 4.481392  4 
7 5.189938  5 
8 5.937064  5 
9 6.562172  5 

B['timestamp'][0](即ち1.739869)の前に来るのでこのように、タイムスタンプ0.896705グループ0です。タイムスタンプ2.410220B['timestamp'][0](すなわち1.739869)より大きく、B['timestamp'][1](すなわち2.467790)より小さいため、グループ1にあります。


またA['timestamp']の値がB['timestamp']でのカットオフ値のものと完全には一致している場合は何をすべきかを決定する必要があります。あなたがB['timestamp'][i] <= A['timestamp'][i] <= B['timestamp'][i+1]iを返すためにsearchsortedたい場合

B['timestamp'].searchsorted(A['timestamp'], side='left') 

を使用してください。あなたがそのような状況でi+1を返すことsearchsortedたい場合

B['timestamp'].searchsorted(A['timestamp'], side='right') 

を使用してください。 sideを指定しない場合は、デフォルトでside='left'が使用されます。

関連する問題