【问题标题】:How two compare two rows from two different dataframes pandas如何比较来自两个不同数据框熊猫的两行
【发布时间】:2020-10-15 02:49:25
【问题描述】:

在比较两个数据帧中的两行时,我需要一些帮助。首先,我需要找到共同值,在这种情况下,它是来自名为 MX 的列中的值(它永远不会改变),一旦它们匹配,我需要比较整行以验证值是否相同以及是否它们确实是相同的就可以了(打印正常),但是如果它们不是甚至一个值都不是,我需要查看它应该是哪个值或不匹配的位置。

#这是固定的数据,不会受到修改(用于比较)。

Data:
dataframe1:
        MX       DT          MN        SC        CS       LN
0       1        11          1        400       1025    802436
1       5        21          4        240       3201    4025731
2      11        25          19       1428      2000    2013654
3      15        36          17       1005      6028    4251367
4      23        55          21        222      4017    1468532
5      38        32          33       426       4892    8347561

dataframe2:
       MX          DT          MN        SC        CS      LN
0      11          25          19       1428      2000   2013654

这是一种情况,它们在 MX:11 行中都匹配。在这两种情况下,整行都是相同的,但在某些情况下,它们不会与:

dataframe3:
       MX          DT          MN        SC        CS      LN
0      11          22          0       1427      2000   2013654

总之,如果任何行的值与 dataframe1 不同,我需要知道不匹配在哪里,哪个应该是预期值 (dataframe1)。 最好在 pandas 中尝试或将其作为 key:values 传递给字典并检查它?

【问题讨论】:

  • 你的意思是df1[df1["MX"].isin(df2["MX"])].eq(df2.to_numpy())
  • 感谢您的回答@HenryYik。是的,我得到了FalseTrue,但是当是False 时如何打印出正确的值?。

标签: python-3.x pandas dataframe


【解决方案1】:

这是一种方法(我稍微调整了数据,以便显示差异):

设置:

df1 = pd.DataFrame({'MX': {0: 1, 1: 5, 2: 11, 3: 15, 4: 23, 5: 38},
                    'DT': {0: 11, 1: 21, 2: 25, 3: 36, 4: 55, 5: 32},
                    'MN': {0: 1, 1: 4, 2: 19, 3: 17, 4: 21, 5: 33},
                    'SC': {0: 400, 1: 240, 2: 1428, 3: 1005, 4: 222, 5: 426},
                    'CS': {0: 1025, 1: 3201, 2: 2000, 3: 6028, 4: 4017, 5: 4892},
                    'LN': {0: 802436, 1: 4025731, 2: 2013654, 3: 4251367, 4: 1468532, 5: 8347561}})

df2 = pd.DataFrame({'MX': {0: 11}, 'DT': {0: 26}, 'MN': {0: 19},
                    'SC': {0: 1428}, 'CS': {0: 2001}, 'LN': {0: 2013654}})

使用 isin 过滤 df1,然后根据布尔值行对 df1 进行切片:

df1 = df1.loc[df1["MX"].isin(df2["MX"])]

print (df1.loc[:, (~df1.eq(df2.to_numpy()).iloc[0]).tolist()])

   DT    CS
2  25  2000

【讨论】:

  • 谢谢@HenryYik。另外,我怎样才能删除索引,这个答案是 2,只是为了查看值?
  • 看不出实际需要去掉,但是可以通过在末尾加上.iloc[0]得到一个系列的结果。
  • 也许我不清楚。打印时它是正确的,但我指的是我只需要从输出中删除 2。我的意思是,只有具有各自值和名称的列。
猜你喜欢
  • 2019-12-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多