python - 如何比较两个 Pandas DataFrame 并显示 DataFrame 2 中的差异

标签 python python-2.7 pandas dataframe

我目前有两个 pandas 数据框:

sales = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
         {'account': 'Alpha Co',  'Jan': 200, 'Feb': 210, 'Mar': 215}]
sales2 = [{'account': 'Jones LLC', 'Jan': 150, 'Feb': 200, 'Mar': 140},
         {'account': 'Alpha Co',  'Jan': 200, 'Feb': 210, 'Mar': 215},
         {'account': 'Blue Inc',  'Jan': 50,  'Feb': 90,  'Mar': 95 }]
test_1 = pd.DataFrame(sales)
test_2 = pd.DataFrame(sales2)

我想要实现的是仅显示“test_2”中的差异,而不显示“test_1”中的差异。

我当前拥有的代码连接了两个数据帧,并显示了两个数据帧之间的总差异,但是我只想查看“test_2”与“test_1”之间的差异,而不是相反:

def compare_dataframes(df1, df2):

    print 'Comparing dataframes...'
    df = pd.concat([df1, df2])
    df = df.reset_index(drop=True)
    df_gpby = df.groupby(list(df.columns))
    idx = [x[0] for x in df_gpby.groups.values() if len(x) == 1]
    compared_data = df.reindex(idx)
    if len(compared_data) > 1:
        print 'No new sales on site!'
    else:
        print 'New sales on site!'
        print(compared_data)

我怎样才能使我当前的功能适应这样的工作?

最佳答案

使用merge带有外部连接和 indicator 参数:

df = test_1.merge(test_2, how='outer', indicator=True)
print (df)
   Feb  Jan  Mar    account      _merge
0  200  150  140  Jones LLC        both
1  210  200  215   Alpha Co        both
2   90   50   95   Blue Inc  right_only

然后按 boolean indexing 仅过滤 right_only 行:

only2 = df[df['_merge'] == 'right_only']
print (only2)
   Feb  Jan  Mar   account      _merge
2   90   50   95  Blue Inc  right_only

感谢 @Jon Clements 提供带有回调的单行解决方案:

only2 = test_1.merge(test_2, how='outer', indicator=True)[lambda r: r._merge == 'right_only']
print (only2)
   Feb  Jan  Mar   account      _merge
2   90   50   95  Blue Inc  right_only

或者使用query :

only2 = test_1.merge(test_2, how='outer', indicator=True).query("_merge == 'right_only'")

关于python - 如何比较两个 Pandas DataFrame 并显示 DataFrame 2 中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52092078/

相关文章:

python - 索引/多重索引内的字符串替换

python - 如何从 Keras 的 model.predict 函数获取预测标签?

python - 单个连接中的多个请求?

python - 无法在 Django、Virtualenv 中创建 super 用户

python - 如何更改元组列表的某些值?

python-2.7 - 使用 k 均值进行图像分割

python - 如何以稳定的方式使用 pytest 断言列表?

python - 使用 beautifulsoup 在表格的第二列中打印文本

python - 根据其他列中包含的字符串为列分配条件值

python - 按组从 Pandas Dataframe 中删除 `NaN`