pandas 比较两个dfs并打印其中一个中不存在的值

soat7uwm  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(139)

我有两个数据框,我想比较这两个数据框并打印df 1中不存在的值。例如:

df1 = |id|check_column1|
      |21|abc|
      |21||bcd|
      |22|hqo|
      |22|hsd|
      |23|mno|

df2 = 

|id|check_column1|
      |21|abc|
      |22|hqo|
      |23|xyz|

我希望输出为

|id|check_column1|chack_colum2|
|23|mno|xyz|

我不希望输出包括其值已存在于df 1中的21-bcd和22-hsd。如果df 1中存在2个值,df 2中反映了1个值,则表示同一ID,我不希望将该ID视为未匹配。

df = pd.merge(df1,df2,left_on =['id',df1.groupby('id').cumcount()], right_on = ['id',df2.groupby('id').cumcount()] )

但这给了所有的错过匹配我想只是那是完全不同的彼此在两个表

ijnw1ujt

ijnw1ujt1#

考虑以下设置:

import pandas as pd

df1 = pd.DataFrame(
    {"id": [21, 21, 22, 22, 23], "check_column1": ["abc", "bcd", "hqo", "hsd", "mno"]}
)
#    id check_column1
# 0  21           abc
# 1  21           bcd
# 2  22           hqo
# 3  22           hsd
# 4  23           mno
df2 = pd.DataFrame(
    {"id": [21, 22, 23, 23], "check_column1": ["abc", "hqo", "xyz", "www"]}
)
#    id check_column1
# 0  21           abc
# 1  22           hqo
# 2  23           xyz
# 3  23           www

如何为每个 Dataframe 的每个id创建一个set,然后计算对应id的 Dataframe 之间的集合差异?

g1 = df1.groupby("id").agg(set)
g2 = df2.groupby("id").agg(set)
diffs = pd.concat([g1 - g2, g2 - g1], axis=1)
diffs.columns = ["check_column1", "check_column2"]
#    check_column1 check_column2
# id                            
# 21         {bcd}            {}
# 22         {hsd}            {}
# 23         {mno}    {xyz, www}

这允许只选择df2中存在df1中没有的值的行:

df = diffs[diffs["check_column2"] != set()]
#    check_column1 check_column2
# id                            
# 23         {mno}    {xyz, www}

相关问题