【问题标题】:Comparing two dataframes and only showing the unmatched column records比较两个数据框并仅显示不匹配的列记录
【发布时间】:2022-01-24 16:32:01
【问题描述】:

我有一个转换为 Pandas Dataframe 的字典列表 我可以打印不匹配的记录,但我不想要整个记录,而只想要记录的不匹配列。

{'A':5,'B':6,'C': 7}] 列表 2 是:[{'A':5,'B':8,'C': 7}],。我只想得到不匹配的 B 输出。假设字典列表将有多个字典。我有两个数据框,正在比较以找到不匹配的记录。

我需要知道如何做到这一点

尝试了可能的解决方案:-

查找公共记录并从数据框中删除,但我得到了整行。

但是我只需要具有不匹配值的列。

请注意大约有 50 列

为 df1

         Date   Fruit   Num   Color
0  2013-11-24  Banana  22.1  Yellow
1  2013-11-24  Orange   8.6  Orange
2  2013-11-24   Apple   7.6   Green
3  2013-11-24  Celery  10.2   Green

为 df2

         Date   Fruit   Num   Color
0  2013-11-24  Banana  22.1  Orange
1  2013-11-24  Orange   8.6  Orange
2  2013-11-24   Apple   7.6   Green
3  2013-11-24  Celery  10.2   Green

对于 df_diff

Color
1 Orange

【问题讨论】:

  • 请展示您的数据框样本和您的预期输出;)
  • [{'A':5,'B':6,'C':7}] 列表 2 是:[{'A':5,'B':8,'C' : 7}] ,.我只想得到不匹配的 B 输出。假设字典列表将有多个字典。我有两个数据框,正在比较以找到不匹配的记录。
  • 如果每个列表更长,它的外观如何?每个列表中的每个字典都有相同的键吗?
  • 是的,你需要更清楚。数据框会是什么样子?
  • 每个字典在列表中都有相同的键如果有 100 个键,它们在两个列表中都是相同的

标签: python python-3.x pandas dataframe pycharm


【解决方案1】:

所以,给定以下字典:

dict_1 = {
    "Date": {0: "2013-11-24", 1: "2013-11-24", 2: "2013-11-24", 3: "2013-11-24"},
    "Fruit": {0: "Banana", 1: "Orange", 2: "Apple", 3: "Celery"},
    "Num": {0: 22.1, 1: 8.6, 2: 7.6, 3: 10.2},
    "Color": {0: "Yellow", 1: "Orange", 2: "Green", 3: "Green"},
}

dict_2 = {
    "Date": {0: "2013-11-03", 1: "2013-11-24", 2: "2013-11-24", 3: "2013-11-24"},
    "Fruit": {0: "Banana", 1: "Orange", 2: "Citrus", 3: "Celery"},
    "Num": {0: 22.1, 1: 2.2, 2: 7.6, 3: 0.2},
    "Color": {0: "Orange", 1: "Orange", 2: "Green", 3: "Green"},
}

你可以像这样找到不同之处:

diff_dict = {}
for outer_key, inner_dict in dict_1.items():
    diff_dict[outer_key] = {}
    for inner_key, inner_value in inner_dict.items():
        if (other_value := dict_2[outer_key][inner_key]) != inner_value:
            diff_dict[outer_key][inner_key] = other_value
        else:
            diff_dict[outer_key][inner_key] = "-"

然后用 Pandas 将它们可视化:

import pandas as pd

print(pd.DataFrame(diff_dict))
# Output

         Date   Fruit  Num   Color
0  2013-11-03       -    -  Orange
1           -       -  2.2       -
2           -  Citrus    -       -
3           -       -  0.2       -

【讨论】:

    【解决方案2】:
    df1 = pd.DataFrame({"Fruit":['Banana','Orange','Apple','Celery'],
                      'Num':[22.1,8.6,7.6,10.2], 'Color':['Yellow','Orange','Green','Green']})
    
    df2 = pd.DataFrame({"Fruit":['Banana','Orange','Mango','Celery'],
                      'Num':[22.1,8.6,7.6,15], 'Color':['Orage','Orange','Green','Green']})
    

    您可以通过布尔索引获取不匹配

    df_diff = df1[df1!=df2].fillna('')
    

    如果你想要两列都存在不匹配和不匹配的值

    {col:i for col in df_diff.columns for i in df_diff[col] if len(str(i)) > 0}
    

    如果你只想要不匹配的列

    [col for col in df_diff.columns for i in df_diff[col] if len(str(i))>0]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-20
      • 1970-01-01
      • 2019-10-30
      • 1970-01-01
      相关资源
      最近更新 更多