通过另一个数据框中的值列表拆分pandas数据帧

时间:2016-11-04 02:02:39

标签: python pandas

我很确定这是一个非常简单的解决方案,我只是没有意识到这一点。然而...

我有一个高频数据的数据框。调用此数据帧A.我还有一个单独的低频分界点列表,调用此B.我想在A中附加一列,如果A的时间戳列在B [0]和B [1]之间,则显示1 ],如果它在B [1]和B [2]之间,则为2,依此类推。

如上所述,这可能是非常微不足道的,我只是在这个晚些时候才意识到这一点。

2 个答案:

答案 0 :(得分:2)

使用searchsorted

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

对于A['timestamp']中的每个值,返回一个索引值。该索引指示B['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

因此,时间戳0.896705位于群组0中,因为它位于B['timestamp'][0]之前(即1.739869)。时间戳2.410220位于群组1中,因为它大于B['timestamp'][0](即1.739869)但小于B['timestamp'][1](即2.467790)。

如果A['timestamp']中的值与B['timestamp']中的某个截止值完全相等,您还应该决定该怎么做。使用

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

如果您希望search {i B['timestamp'][i] <= A['timestamp'][i] <= B['timestamp'][i+1]时返回B['timestamp'].searchsorted(A['timestamp'], side='right') 。使用

i+1

如果您希望searchsorted在这种情况下返回side。如果您未指定side='left',则默认使用perl

答案 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]