Pandas 使用Python比较两个具有不同行数的Excel文件

Pandas 使用Python比较两个具有不同行数的Excel文件,pandas,numpy,python-3.7,Pandas,Numpy,Python 3.7,我正在使用Python3.7,我想比较两个Excel文件,它们有相同的列(140列),但行数不同,我在网站上查看了一下,但没有找到适合我的案例的解决方案 以下是一个例子: df1 (old report) : id qte d1 d2 A 10 23 35 B 43 63 63 C 15 61 62 df2 (new report) : id qte

我正在使用Python3.7,我想比较两个Excel文件,它们有相同的列(140列),但行数不同,我在网站上查看了一下,但没有找到适合我的案例的解决方案

以下是一个例子:

df1 (old report) : 

id       qte     d1    d2

A        10      23    35  

B        43      63    63

C       15       61    62

df2 (new report) : 

id       qte     d1    d2

A        20      23    35  

C       15       61    62

E       38       62    16

F       63       20    51
结果应该是:

  • 修改行必须为黄色,修改值必须为红色

  • 新的一排是绿色的

  • 删除的行显示为红色

    id qte d1 d2

    A 20 23 35

    C 15 61 62

    B 43 63

    E 38 62 16

    F 63 20 51

守则:

import pandas as pd
import numpy as np

df1= pd.read_excel(r'C .....\data novembre.xlsx','Sheet1',na_values=['NA'])
df2= pd.read_excel(r'C.....\data decembre.xlsx','Sheet1',na_values=['NA'])
merged_data=df1.merge(df2, left_on = 'id', right_on = 'id', how = 'outer')
加入数据虽然不是我想要的


我刚刚开始学习Python,所以我真的需要帮助

一个excel diff可以很快变成一个时髦的野兽,但我们应该能够通过一些
concats
和布尔语句来做到这一点

假设您的数据帧被称为
df1、df2

df1 = df1.set_index('id')
df2 = df2.set_index('id')

df3 = pd.concat([df1,df2],sort=False)
df3a = df3.stack().groupby(level=[0,1]).unique().unstack(1).copy()


df3a.loc[~df3a.index.isin(df2.index),'status'] = 'deleted' # if not in df2 index then deleted
df3a.loc[~df3a.index.isin(df1.index),'status'] = 'new'     # if not in df1 index then new
idx = df3.stack().groupby(level=[0,1]).nunique() # get modified cells. 
df3a.loc[idx.mask(idx <= 1).dropna().index.get_level_values(0),'status'] = 'modified'
df3a['status'] = df3a['status'].fillna('same') # assume that anything not fufilled by above rules is the same.
如果您不介意将所有数据类型转换为字符串对性能的影响,那么这可能会起作用。但我不推荐这样做,使用事实或缓慢变化的维度模式来保存这些数据,将来你会感谢自己的

df3a.stack().explode().astype(str).groupby(level=[0,1]).agg('-->'.join).unstack(1)

    d1  d2      qte    status
id                           
A   23  35  10-->20  modified
B   63  63       43   deleted
C   61  62       15      same
E   62  16       38       new
F   20  51       63       new

1000多亏了你,它工作了!,我还有一个问题,如果我想用绿色突出显示新行,用红色突出显示删除的行,修改后的行将用黄色突出显示(对于修改后的值,我将只在数组中保留新值),我怎么做?@FaziaChenna没问题:)看这里我在Pandasys中设计裤子我明白了,谢谢,在之前的结果中,最后一件事是(d1 d2和qte)的位置发生了变化,它应该是这样的:id qte d1 d2。我怎么能有相同的专栏structure@FaziaChenna您可以通过手动指定cols
df3a[df1.columns]
应该起作用来设置它。别忘了接受答案:)我没有得到我想要的结果,问题是我的原始文件有140多列,我在应用代码时它不起作用!
df3a.stack().explode().astype(str).groupby(level=[0,1]).agg('-->'.join).unstack(1)

    d1  d2      qte    status
id                           
A   23  35  10-->20  modified
B   63  63       43   deleted
C   61  62       15      same
E   62  16       38       new
F   20  51       63       new