【问题标题】:Join two pandas dataframes and match data to one column加入两个熊猫数据框并将数据匹配到一列
【发布时间】:2021-05-15 13:30:57
【问题描述】:

我有以下 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.x pandas dataframe


    【解决方案1】:

    你试过了吗

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

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

    于 2021 年 2 月 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”字段。

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

    【讨论】:

    • 是的,我刚试过,我得到了一个包含所有行的空白数据框
    • 'on' 列的数据类型是否相同?它们的生成方式是否相同(例如,没有多余的空格)
    • 您的数据最终会产生所需的结果。我用“_”替换了列名中的空格,去掉了 df_a 列标题中的“#”字符,确认合并列没有前导或尾随空格,并从 df_b 中删除了一行,这给了我四行全部列。
    • 两列数据类型都是非空对象。 DF_A = 13974 非空对象和 DF_B = 670 非空对象。我应该更改数据类型吗?我要重新检查两列是否完全相同。
    • 用测试结果更新了我的答案。尝试更改您的列名...如果这实际上是 df_a 中名称的一部分,请务必删除“#”)。检查“on”字段中的空格或使用替代方法进行测试。
    猜你喜欢
    • 2019-06-21
    • 1970-01-01
    • 1970-01-01
    • 2019-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-02
    • 1970-01-01
    相关资源
    最近更新 更多