【问题标题】:Pandas dataframe comparison hangs without error messagePandas 数据框比较挂起且没有错误消息
【发布时间】:2016-09-30 11:01:25
【问题描述】:

这是我第一次尝试 pandas,所以我想知道问题出在哪里。我正在尝试比较两个大约 30.000 行的数据框。我的第一个直觉引导我迭代两个数据帧,因此对于 df1 中的每个条目,我们迭代 df2 中的所有行以查看它是否存在。

也许根本没有必要,还有更简单的选择。这就是我所做的。问题是,它只是挂起而没有输出任何错误消息,但我无法确定是什么导致它挂起......

import pandas as pd


dfOld = pd.read_excel("oldfile.xlsx", header=0)
dfNew = pd.read_excel("newfile.xlsx", header=0)
columns = ["NAME","ADDRESS","STATUS","DATE"]
result = pd.DataFrame(columns=columns)

for index, rowOld in dfOld.iterrows():

    for index, rowNew in dfNew.iterrows():

        if rowOld.all() != rowNew.all():
            result.loc[len(result)] = rowOld.all()


writer = pd.ExcelWriter('Deletions.xlsx', engine='xlsxwriter')
result.to_excel(writer, sheet_name='Deleted')
writer.save()

每个数据帧的样本数据:

$1 & UP STORE CORP.142A | N FRANKLIN ST | 409 408 | 31/07/2014
$1 store | 110 n martin ave | 408 | 07/01/2015
0713, LLC | 1412 N. County Road West | 405 408 413 | 16/07/2015
1 2 3 MONEY EXCHANGE LLC | 588 N MAIN ST | 405 409 408 | 22/05/2015


$1 store premium | 110 n martin ave | 408 | 07/01/2015
0713, LLC | 1412 N. County Road West | 405 408 413 | 16/07/2015
1 2 3 MONEY EXCHANGE LLC | 588 N MAIN ST | 405 409 408 | 22/05/2015
1145 Parsons Inc | 1145 Parsons Ave | 405 408 | 19/11/2013

所需的输出是数据框results 填充了dfOld 中不存在于dfNew 中的行。因此,新的 results 数据框将包括:

$1 & UP STORE CORP.142A | N FRANKLIN ST | 409 408 | 31/07/2014
$1 store | 110 n martin ave | 408 | 07/01/2015

问题在于它不适用于大量(每个数据帧 30.000 个条目),所以即使它可以处理较小的样本,我想知道这是否是处理这么多条目的方法。

【问题讨论】:

  • 您可以添加数据样本(每个 df 5,6 行)和所需的输出吗?
  • 谢谢你,如果你得到想要的输出,它可以很容易验证。
  • 我也尝试了您的解决方案,并通过示例可以正常工作(我不确定是对是错)

标签: python pandas


【解决方案1】:

您可以将merge 与参数indicator=True 一起使用,然后按boolean indexing 过滤:

df = pd.merge(dfOld, dfNew, how='outer', indicator=True)
print (df)
                       NAME                   ADDRESS       STATUS  \
0   $1 & UP STORE CORP.142A             N FRANKLIN ST      409 408   
1                  $1 store          110 n martin ave          408   
2                 0713, LLC  1412 N. County Road West  405 408 413   
3  1 2 3 MONEY EXCHANGE LLC             588 N MAIN ST  405 409 408   
4          $1 store premium          110 n martin ave          408   
5          1145 Parsons Inc          1145 Parsons Ave      405 408   

         DATE      _merge  
0  31/07/2014   left_only  
1  07/01/2015   left_only  
2  16/07/2015        both  
3  22/05/2015        both  
4  07/01/2015  right_only  
5  19/11/2013  right_only 

print (df[df._merge == 'left_only'])
                      NAME           ADDRESS   STATUS        DATE     _merge
0  $1 & UP STORE CORP.142A     N FRANKLIN ST  409 408  31/07/2014  left_only
1                 $1 store  110 n martin ave      408  07/01/2015  left_only

最后删除帮助列_merge

print (df[df._merge == 'left_only'].drop('_merge', axis=1))
                      NAME           ADDRESS   STATUS        DATE
0  $1 & UP STORE CORP.142A     N FRANKLIN ST  409 408  31/07/2014
1                 $1 store  110 n martin ave      408  07/01/2015

【讨论】:

  • 谢谢。这实际上达到了我想要的效果,并且没有挂起,不像我的方法。
猜你喜欢
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 1970-01-01
  • 2018-09-24
  • 2016-09-08
  • 1970-01-01
  • 2016-08-16
相关资源
最近更新 更多