python - 根据最近的值合并 Pandas 数据帧

标签 python pandas

我有两个数据框,比如 AB,它们有一些名为 attr1attr2 的列, attrN.

我有一定的距离度量,我想合并数据帧,这样 A 中的每一行都与 B 中最短的行合并属性之间的距离。请注意,B 中的行在合并时可以重复。

例如(使用一个属性以保持简单),使用绝对差异距离合并这两个表 |A.attr1 - B.att1|

A | attr1      B | attr1
0 | 10         0 | 15
1 | 20         1 | 27
2 | 30         2 | 80

应该产生下面的合并表

M | attr1_A  attr1_B
0 | 10       15
1 | 20       15
2 | 30       27

我目前的做法很慢,并且是基于将 A 的每一行与 B 的每一行进行比较,但代码也不清楚,因为我必须保留合并索引,我一点都不满意,但我想不出更好的解决方案。

如何使用 pandas 执行上述合并?是否有任何方便的方法或功能可以在这里提供帮助?

编辑:澄清一下,在数据框中还有其他列未用于距离计算,但也必须合并。

最佳答案

一种方法如下:

A = pd.DataFrame({'attr1':[10,20,30]})
B = pd.DataFrame({'attr1':[15,15,27]})

使用交叉连接获取所有组合

1.2+ pandas 的更新使用 how='cross'

merge_AB = A.merge(B, how='cross', suffixes = ('_A', '_B'))

旧的 pandas 版本使用伪 key ...

A = A.assign(key=1)
B = B.assign(key=1)

merged_AB =pd.merge(A,B, on='key',suffixes=('_A','_B'))

现在让我们找出 merged_AB 中的最小距离

M = merged_AB.groupby('attr1_A').apply(lambda x:abs(x['attr1_A']-x['attr1_B'])==abs(x['attr1_A']-x['attr1_B']).min())

merged_AB[M.values].drop_duplicates().drop('key',axis=1)

输出:

   attr1_A  attr1_B
0       10       15
3       20       15
8       30       27

关于python - 根据最近的值合并 Pandas 数据帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43491342/

相关文章:

python - 在 Python 中处理 UTF 文件名

python - 基于特定列属性的 Pandas fillna()

python - 如何将dataframe转换为json

python - 通过添加列合并重复行 'count'

python - Seaborn – 如何解释分布图中 x 轴的值?

python - pandas:按列分组并将编号的重复列添加到新数据框

python - 使用具有参数亲和性 ='precomputed' 的类 sklearn.cluster.SpectralClustering

python - 切片多维列表

python - IBM MQ python3 模块?

python - 引发异常是测试输入类型的可接受方法