标题有点困惑,但我会尽力在这里解释我的问题。我有 2 个 Pandas 数据框,a 和 b:
>> print a
id | value
1 | 250
2 | 150
3 | 350
4 | 550
5 | 450
>> print b
low | high | class
100 | 200 | 'A'
200 | 300 | 'B'
300 | 500 | 'A'
500 | 600 | 'C'
我想在表 a 中创建一个名为 class 的新列,其中包含与表 b 一致的值的类。这是我想要的结果:
>> print a
id | value | class
1 | 250 | 'B'
2 | 150 | 'A'
3 | 350 | 'A'
4 | 550 | 'C'
5 | 450 | 'A'
我编写了以下代码来完成我想要的:
a['class'] = pd.Series()
for i in range(len(a)):
val = a['value'][i]
cl = (b['class'][ (b['low'] <= val) \
(b['high'] >= val) ].iat[0])
a['class'].set_value(i,cl)
问题是,这对于长度为 10 左右的表来说很快,但我正在尝试使用 a 和 b 的 100,000+ 表大小来执行此操作。有没有更快的方法来做到这一点,使用 pandas 中的一些函数/属性?
最佳答案
这是一种受@piRSquared 的 solution 启发进行范围连接的方法。 :
A = a['value'].values
bh = b.high.values
bl = b.low.values
i, j = np.where((A[:, None] >= bl) & (A[:, None] <= bh))
pd.DataFrame(
np.column_stack([a.values[i], b.values[j]]),
columns=a.columns.append(b.columns)
)
输出:
id value low high class
0 1 250 200 300 'B'
1 2 150 100 200 'A'
2 3 350 300 500 'A'
3 4 550 500 600 'C'
4 5 450 300 500 'A'
关于python - 将一个数据框中的值与另一个数据框中的列中的值进行比较,并从第三列获取数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45364054/