python - Pandas 根据最接近的匹配合并数据帧

标签 python pandas

我有以下 2 个数据帧(df_a、df_b):

df_a

    N0_YLDF
0   11.79
1   7.86
2   5.78
3   5.35
4   6.32
5   11.79
6   6.89
7   10.74


df_b
    N0_YLDF N0_DWOC
0   6.29    4
1   2.32    4
2   9.10    4
3   4.89    4
4   10.22   4
5   3.80    3
6   5.55    3
7   6.36    3

我想在 df_a 中添加一列 N0_DWOC,以便该列中的值来自 df_a['N0_YLDF'] 最接近 df_b['N0_YLDF'] 的行。

现在,我正在做一个简单的合并,但这并没有达到我想要的效果

最佳答案

您可以在 df_b['N0_YLDF'] 中找到位于(已排序)值中间的截止值。然后调用pd.cutdf_a['N0_YLDF']中的值进行分类,截止值为bin边缘:

import numpy as np
import pandas as pd

df_a = pd.DataFrame({ 'N0_YLDF': [11.79, 7.86, 5.78, 5.35, 6.32, 11.79, 6.89, 10.74]})
df_b = pd.DataFrame({ 'N0_YLDF':[6.29, 2.32, 9.10, 4.89, 10.22, 3.80, 5.55, 6.36] })

edges, labels = np.unique(df_b['N0_YLDF'], return_index=True)
edges = np.r_[-np.inf, edges + np.ediff1d(edges, to_end=np.inf)/2]
df_a['N0_DWOC'] = pd.cut(df_a['N0_YLDF'], bins=edges, labels=df_b.index[labels])
print(df_a)

产量

In [293]: df_a
Out[293]: 
   N0_YLDF N0_DWOC
0    11.79       4
1     7.86       2
2     5.78       6
3     5.35       6
4     6.32       0
5    11.79       4
6     6.89       7
7    10.74       4

要加入 N0_DWOC 上的两个 DataFrame,您可以使用:

print(df_a.join(df_b, on='N0_DWOC', rsuffix='_b'))

产生

   N0_YLDF N0_DWOC  N0_YLDF_b
0    11.79       4      10.22
1     7.86       2       9.10
2     5.78       6       5.55
3     5.35       6       5.55
4     6.32       0       6.29
5    11.79       4      10.22
6     6.89       7       6.36
7    10.74       4      10.22

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

相关文章:

python - 根据字符数拆分字符串列

python - 莫尔斯电码程序不处理带空格的测试用例

python - 将两个日期时间对象转换为每月日期时间范围

python - DRF - 具有非模型 write_only 字段的 ModelSerializer

python - numpy - 多维网格

python - 如何将网页中嵌入的视频链接名称与视频名称一起提取

python - Pandas Dataframe 到 JSON 层次结构

python - 如何选择 pandas 中一组的最后一行?

python - 优化将一个 MongoDB 中的字段与另一个 MongoDB 进行比较时的速度

python - 两个大型数据集的最快迭代合并