python - 将一个数据框中的值与另一个数据框中的列中的值进行比较,并从第三列获取数据

标签 python pandas

标题有点困惑,但我会尽力在这里解释我的问题。我有 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/

相关文章:

python - 如何使用 Pyramid(Python 框架)模拟 mod_rewrite 的 url 别名功能?

python - 我应该如何处理Python中访问sqlite数据库的多个线程?

python - "Solving Environment"在 `conda install -c <my_channel> tensorflow` 期间需要 3 分钟以上,但稍微更改名称会显着减少时间

python - 用零和一替换数据框中的值

python - PyCharm - 如何自动将项目中的所有标识符重命名为snake_case?

javascript - 带按钮 javascript 的 Python post 表单

python - 使用键重新组合 pandas 中的数据框。比迭代行更快的方法?

Python 带有条件的 Groupby

python - 按列轴移动时,Pandas DataFrame.Shift 返回错误结果

python - 如何为 pandas.DataFrame().index 添加后缀/前缀?