【问题标题】:Pandas merge dataframes based on closest matchPandas 基于最接近的匹配合并数据帧
【发布时间】:2015-08-10 04:43:59
【问题描述】:

我有以下 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'] 的行。

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

【问题讨论】:

标签: python pandas


【解决方案1】:

您可以在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

【讨论】:

  • 我没有在上面的示例中包含它,但如果它存在,join 将合并df_b['N0_DWOC'] 为一个名为N0_DWOC_b 的新列。如果这不是您想要的,请更新您的 Q 以包含所需的输出。
【解决方案2】:

另一种方法是对笛卡尔积中的所有对进行减法,并获得每个对的最小绝对值索引:

In [47]:ix = abs(np.atleast_2d(df_a['N0_YLDF']).T - df_b['N0_YLDF'].values).argmin(axis=1)
        ix
Out[47]: array([4, 2, 6, 6, 0, 4, 7, 4])

那就做吧

df_a['N0_DWOC'] = df_b.ix[ix, 'N0_DWOC'].values

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

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 2022-01-20
    • 2018-03-18
    • 1970-01-01
    • 2021-01-29
    • 2020-07-21
    • 2020-10-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多