【问题标题】:List out unmatched rows from the two dataframes列出两个数据框中不匹配的行
【发布时间】:2019-03-04 02:16:47
【问题描述】:

Raw1

      Name     Age    Height
0    Ronaldo   25     189.0
1    Honey     26     193.0
2    Kola      14     200.0
3    Tree      19     155.0
4    Rot       22     165.0
5    Rat       28     170.0
6    Toy       30     172.0
7    Raft      32     156.0
8    Rifle     28     165.0

Raw2

     Name      Age     Height
0   Ronaldo    25      189.0
1   Honey      26      NaN
2   Kola       14      200.0
3   Tree       0       155.0
4   Rot        22      NaN
5   NaN        28      170.0
6   Toy        30      172.0
7   Raft       32      156.0
8   Rifle      28      165.0

我想列出这 2 个数据框之间不匹配的行。但是,我只能通过 right_index 合并列出匹配的行。

raw4=pd.merge(raw1,raw2, on=['Name','Age','Height'], right_index=True)

电流输出

     Name  Age  Height
0  Ronaldo 25   189.0
2  Kola    14   200.0
6  Toy     30   172.0
7  Raft    32   156.0
8  Rifle   28   165.0

预期输出

     Name    Age  Height
1   Honey    26   NaN
3   Tree     0    155.0
4   Rot      22   NaN

【问题讨论】:

  • 为什么raw2的第5行没有列出来?
  • 是的,它应该被列出来......

标签: python-3.x dataframe merge


【解决方案1】:

您可以按元素方式比较 DataFrame,然后检查其中任何项目不同的那些行:

indexes = (raw1 != raw2).any(axis=1)
raw4 = raw2.loc[indexes]

输出:

    Name  Age  Height
1  Honey   26     NaN
3   Tree    0   155.0
4    Rot   22     NaN
5    NaN   28   170.0

请注意,如果raw1raw2 中的两个值都是NaNNaN 始终不同于任何数字,包括NaN),则此方法将不起作用。

【讨论】:

  • 只是试图理解代码行。第一个(索引)在按列检查 raw1 和 raw2 之间的差异后存储布尔值。之后,“ raw4 = raw2.loc[indexes] ”使用布尔值作为指示不同行的指示符打印 raw2 的行?但我很好奇 raw2.loc[indexes] 的机制。你能解释一下它实际上是如何工作的吗? raw2.loc[布尔值]
  • DataFrame.loc 可以以多种不同的方式工作。在这里,它只是创建了一个新的DataFrame,其中包含indexes == True 所在的索引。有关更多信息,请参阅pandas - Indexing and Selecting Data
  • 感谢您的链接。我尝试在后一个数据框中修改“高度”列中的值(插入数字)并且代码有效。但是,如果我在列中插入字母,代码会打印出每一行。这里可能有什么问题?
  • 我不确定。也许发生了一些隐式类型转换(?)在这些情况下,我通常会打印出每个计算的结果并检查代码哪里出错了。还要确保检查你的 dtypes(df.info() 很有帮助)。
  • 感谢您的建议。我听取了您的建议并检查了每列的数据类型。实际上,两个表的同一列的数据类型是不同的。一旦我将每一列都转换为字符串,一切都会像魔术一样工作。
猜你喜欢
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-13
  • 2020-12-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多