【问题标题】:Joining tables in python with different lengths based on a key field基于关键字段在python中连接不同长度的表
【发布时间】:2018-02-19 13:04:58
【问题描述】:

所以我想用两个表都包含的键字段对两个表进行连接,这样我就可以进行并排比较。

表 A 有 1164 行,表 B 有 74 行。表 A 中的公共字段称为 EmployeeID,表 B 中的“相同”字段称为 UserID。

Table A

Table B

我希望有 3 种形式的输出:

  1. 表 1 包含仅在表 A 中找到关键字段值的记录。 (左不匹配)
  2. 具有匹配记录的表 2(因此在表 A 和 B 中找到关键字段值。(INNER JOIN)
  3. 表 3 中包含仅在表 B 中的记录。(未匹配正确)

解决这个问题的最佳方法是什么?

当我使用这段代码时:

data_left_join = pd.merge(table_a, table_b, how='left')

结果我得到了 48268 行。

我能找到的所有文章都是用 SQL 或 R 写的。

我设法导入了表格并对表格进行了一些修改。但我被困在这里。

提前致谢。

【问题讨论】:

    标签: python pandas join inner-join


    【解决方案1】:

    您可以将merge()left_onright_on 参数一起使用来指定您的关键字段,然后检查NaN 值以查找哪些行不在表中:

    import pandas as pd
    
    # Create dataframes to test with
    table_a = pd.DataFrame({
        "value": [1, 2, 3, 4, 5],
        "employee_id": [100, 200, 300, 400, 500]
    })
    print "Table A:\n", table_a
    
    table_b = pd.DataFrame({
        "value": [1, 2, 3, 4, 5],
        "user_id": [100, 200, 300, 1000, 2000],
        "age": [40, 50, 60, 70, 80]
    })
    print "\nTable B:\n", table_b
    
    # Merge table A (left) on employee_id, and table B (right) on user_id
    merged = table_a.merge(table_b, left_on="employee_id", right_on="user_id", how="outer", suffixes=("_tableA", "_tableB"))
    print "\nMerged:\n", merged
    
    # Table A-columns with NaNs are not present in table B
    only_in_table_a = merged.loc[merged.value_tableB.isnull()]
    print "\nOnly in table A:\n", only_in_table_a
    
    # Table B-columns with NaNs are not present in table A
    only_in_table_b = merged.loc[merged.value_tableA.isnull()]
    print "\nOnly in table B:\n", only_in_table_b
    
    # Rows with no NaNs are in both tables
    in_both = merged.dropna(subset=["employee_id", "user_id"])
    print "\nIn both:\n", in_both
    

    产量:

    Table A:
       employee_id  value
    0          100      1
    1          200      2
    2          300      3
    3          400      4
    4          500      5
    
    Table B:
       age  user_id  value
    0   40      100      1
    1   50      200      2
    2   60      300      3
    3   70     1000      4
    4   80     2000      5
    
    Merged:
       employee_id  value_tableA   age  user_id  value_tableB
    0        100.0           1.0  40.0    100.0           1.0
    1        200.0           2.0  50.0    200.0           2.0
    2        300.0           3.0  60.0    300.0           3.0
    3        400.0           4.0   NaN      NaN           NaN
    4        500.0           5.0   NaN      NaN           NaN
    5          NaN           NaN  70.0   1000.0           4.0
    6          NaN           NaN  80.0   2000.0           5.0
    
    Only in table A:
       employee_id  value_tableA  age  user_id  value_tableB
    3        400.0           4.0  NaN      NaN           NaN
    4        500.0           5.0  NaN      NaN           NaN
    
    Only in table B:
       employee_id  value_tableA   age  user_id  value_tableB
    5          NaN           NaN  70.0   1000.0           4.0
    6          NaN           NaN  80.0   2000.0           5.0
    
    In both:
       employee_id  value_tableA   age  user_id  value_tableB
    0        100.0           1.0  40.0    100.0           1.0
    1        200.0           2.0  50.0    200.0           2.0
    2        300.0           3.0  60.0    300.0           3.0
    

    【讨论】:

    • 这真的很有帮助,这回答了我的问题。谢谢!我想诀窍是我正在寻找的 how='outer' 部分。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-05
    • 1970-01-01
    • 2019-01-19
    • 1970-01-01
    • 2021-10-21
    相关资源
    最近更新 更多