【问题标题】:Reading from two excel and creating difference file从两个excel中读取并创建差异文件
【发布时间】:2019-01-28 08:31:24
【问题描述】:

读取两个 excel 文件并将差异写入另一个 excel 文件。它显示了差异,但不在正确的索引处。它不是在适当的位置写“正确”。请告诉我如何修复 这是我的代码

import pandas as pd
import numpy as np


   def report_diff(x):
    if x[0] == x[1]:
         return 'Correct'
    else:
         return '{} ---> {}'.format(*x)

def has_change(row):
if "--->" in row.to_string():
    return "Y"
else:
    return "N"

df1 = pd.read_excel(r'File1.xlsx', 'Sheet1', na_values=['NA']) df2 =
pd.read_excel(r'File2.xlsx', 'Sheet1', na_values=['NA'])

df = pd.read_excel(r'File1.xlsx') writer =
pd.ExcelWriter('Differences.xlsx')
df.to_excel(writer,'Highlighting-Error',index=False)

diff_panel = pd.Panel(dict(df1=df1,df2=df2))

diff_output = diff_panel.apply(report_diff, axis=0)

diff_output['has_change'] = diff_output.apply(has_change, axis=1)


diff_output[(diff_output.has_change ==
'Y')].to_excel(writer,sheet_name='Difference-Sheet',index=False,
                                                columns["dbsymbol","alias"])

writer.save()

数据:

dbSymbol    Alias
UQ_121      mike
UQ142       Sam
UQ143       john
UQ144       deep
UQ145      shubh
UQ_121      joe
UQ_121      name

dbSymbol    Alias
UQ_121      mike
UQ142       sammy
UQ143       johnny
UQ144           deep
UQ145           shubh
UQ_121        Ann

Output: 
dbSymbol    Alias
UQ_121      mike
UQ142       Sam---> Sammy
UQ143       john--->Johnny
UQ144       deep
UQ145      shubh
UQ_121        Ann--->mike
UQ_121     shubh-->mike
UQ_121     name-->mike

【问题讨论】:

  • 您可以创建一些示例数据并发布问题吗?我认为minimal, complete, and verifiable example.
  • 够了吗? @jezrael
  • 是的,没关系。但是有一个问题 - df1 和 df2 的行数总是相同?
  • 是的。它具有相同的行数@jezrael

标签: excel python-3.x pandas


【解决方案1】:

我认为您的解决方案应该简化 DataFrame.where 并且对于布尔掩码的 Falses 值加入 DataFrames--->

mask = df1 == df2
diff_output = df1.where(mask, df1.astype(str) + ' ---> ' + df2.astype(str))
print (diff_output)
  dbSymbol             Alias
0   UQ_121              mike
1    UQ142    Sam ---> sammy
2    UQ143  john ---> johnny
3    UQ144              deep
4    UQ145             shubh

详情

print (mask)
   dbSymbol  Alias
0      True   True
1      True  False
2      True  False
3      True   True
4      True   True

编辑:如果可以使用不同长度的重复数据帧:

print (df1)
  dbSymbol  Alias
0   UQ_121   mike
1    UQ142    Sam
2    UQ143   john
3    UQ144   deep
4    UQ145  shubh
5   UQ_121    joe
6   UQ_121   name

print (df2)
  dbSymbol   Alias
0   UQ_121    mike
1    UQ142   sammy
2    UQ143  johnny
3    UQ144    deep
4    UQ145   shubh
5   UQ_121     Ann

df1['count'] = df1.groupby('dbSymbol').cumcount()
df2['count'] = df2.groupby('dbSymbol').cumcount()
df1 = df1.set_index(['count','dbSymbol'])
df2 = df2.set_index(['count','dbSymbol'])
df1, df2 = df1.align(df2)
df1 = df1.fillna('').reset_index()
df2 = df2.fillna('').reset_index()

print (df1)
   count dbSymbol  Alias
0      0    UQ142    Sam
1      0    UQ143   john
2      0    UQ144   deep
3      0    UQ145  shubh
4      0   UQ_121   mike
5      1   UQ_121    joe
6      2   UQ_121   name

print (df2)
   count dbSymbol   Alias
0      0    UQ142   sammy
1      0    UQ143  johnny
2      0    UQ144    deep
3      0    UQ145   shubh
4      0   UQ_121    mike
5      1   UQ_121     Ann
6      2   UQ_121        

mask = df1 == df2
diff_output = df1.where(mask, df1.astype(str) + ' ---> ' + df2.astype(str))
print (diff_output)
   count dbSymbol             Alias
0      0    UQ142    Sam ---> sammy
1      0    UQ143  john ---> johnny
2      0    UQ144              deep
3      0    UQ145             shubh
4      0   UQ_121              mike
5      1   UQ_121      joe ---> Ann
6      2   UQ_121        name ---> 

【讨论】:

  • 实际上它的行数不相等@jezrael
  • @deep5459 - 嗯,dbSymbol 值在两个 excel 文件中都是唯一的?
  • 不,同一个 dbsymbol @jezrael 可以有多个条目
  • @deep5459 - 好的,有多列?还是总是只有dbSymbolAlias
  • 共有多列@jezrael
猜你喜欢
  • 1970-01-01
  • 2019-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
相关资源
最近更新 更多