本当に簡単な解決策があると確信しています。しかし...パンダのデータフレームを別のデータフレームの値のリストで分割する
私は高周波データのデータフレームを持っています。 Aのタイムスタンプ列がB [0]とB [1の間にある場合、1を表示する列にAを追加したいと思います。 ]、B [1]とB [2]の間にある場合は2などとなります。
これはおそらく信じられないほど些細なことであり、私は今この1時間後にそれを実現していないだけです。
本当に簡単な解決策があると確信しています。しかし...パンダのデータフレームを別のデータフレームの値のリストで分割する
私は高周波データのデータフレームを持っています。 Aのタイムスタンプ列がB [0]とB [1の間にある場合、1を表示する列にAを追加したいと思います。 ]、B [1]とB [2]の間にある場合は2などとなります。
これはおそらく信じられないほど些細なことであり、私は今この1時間後にそれを実現していないだけです。
ここでは、リストの理解を使用して迅速かつ汚いアプローチです。
>>> 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]
使用searchsorted
:A['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.410220
はB['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'
が使用されます。