首页 > 解决方案 > 加入两个熊猫数据框并将数据匹配到一列

问题描述

我有以下 2 个取自 excel 文件的数据框:

df_a = 10000 行(如具有所有唯一 #s 的主列表)

df_b = 670 行

我正在加载一个包含 zip、地址、状态的 excel 文件 (df_b),我想匹配该信息,然后添加来自 df_a 的供应商#,这样我就可以拥有 1 个仍然是 670 行但现在有供应商行列的文件.

df_a =
(10000 rows)
  (unique)
 supplier #  ZIP   ADDRESS        STATE   Unique Key
0  7100000  35481  14th street     CA      35481-14th street-CA
1  7000005  45481  14th street     CA      45481-14th street-CA
2  7000006  45482  140th circle     CT     45482-140th circle-CT
3  7000007  35482  140th circle     CT     35482-140th circle-CT
4  7000008  35483  13th road        VT     35483-13th road-VT

df_b = 
(670 rows) 
    ZIP   ADDRESS          STATE         Unique Key
0    35481  14th street     CA      35481-14th street-CA
1    45481  14th street     CA      45481-14th street-CA
2   45482  140th circle     CT     45482-140th circle-CT
3    35482  140th circle     CT     35482-140th circle-CT
4    35483  13th road        VT     35483-13th road-VT

OUTPUT:
 df_c =
(670 rows)
    ZIP   ADDRESS          STATE         Unique Key          (Unique)supplier #
0    35481  14th street     CA      35481-14th street-CA          7100000 
1    45481  14th street     CA      45481-14th street-CA          7100005
2   45482  140th circle     CT     45482-140th circle-CT          7100006
3    35482  140th circle     CT     35482-140th circle-CT          7100007
4    35483  13th road        VT     35483-13th road-VT            7100008

我尝试将 2 个 dfs 合并在一起,但它们不匹配,而是我得到了一堆 NAn

df10 = df_a.merge(df_b, on = 'Unique Key', how= 'left'

结果是 1 个数据框,其中包含很多列且没有匹配项。此外,我也尝试过 .map 和 .concat 。我不确定发生了什么事。

标签: python-3.xpandasdataframe

解决方案


你有没有尝试过

df10 = df_a.merge(df_b, on = 'Unique Key', how = "inner")

“内部连接”仅保留公共记录,IIUC 是您想要实现的

添加于 2021-02-14

从您的测试数据创建 csvs 并读入 pandas

在此处输入图像描述

在此处输入图像描述

df_mrg = df_a.merge(df_b[1:3], how='inner', on='Unique_Key')
df_mrg

产生: 在此处输入图像描述

笔记:

  • df_b 上的切片以创建子集
  • 更改了列名(_ 以外的空格和符号让我的皮肤爬行)
  • 我还手动消除了 Unique_Key 中单元格值的前导和尾随空格(有可以自动化的字符串方法)

还要考虑:

df_mrg = df_a.merge(df_b[1:3], how='right', on='Unique_Key')

将为当前数据返回与“内部”相同的数据框,但根据您的数据和您想知道的内容,可能值得测试。

此外,合并允许传递列列表。由于复合键的源列在两个表中,您可以通过以下方式测试复合键的潜在问题:

df_mrg2 = df_a.merge(df_b[1:3], how='inner', on=['ZIP','ADDRESS','STATE'])
np.where(df_mrg2['Unique_Key_x']==df_mrg2['Unique_Key_y'],True,False)

df_mrg2 返回与 df_mrg 相同的记录集,但不重复“on”字段。

所有这些都超出了回答您的问题,但希望它有所帮助


推荐阅读