【问题标题】:Comparing two dataframes to return a new dataframe using pandas - Python使用 pandas 比较两个数据帧以返回一个新的数据帧 - Python
【发布时间】:2019-01-23 06:02:03
【问题描述】:

需要你的帮助。

我有两个从 csvs 创建的数据框,我需要返回一个新的数据框,这将是特定字段/列上两者之间的差异。例如,如果 df1 中的 ID 不在 df2 中,则 df3 应该为我提供 df1 中不在 df2 中的所有列和行。

注意 df1 和 df2 列不相同,即 df1 可以比 df2 有更多或更少的列,但 df3 中的列应该与 d1 相同。此外,ID(来自 df1)和用户 ID (df2) 值将成为协调因素,字段中的数据将是共同因素,但实际字段名称不同。

由于下表不清楚,请提前致歉。所以在下面的例子中,df1 中的第一行不在 df2 中,df3 应该有这一行。完成后,我需要将 df3 保存为 csv。

DF1

方向 ID 数量 公司状态

卖出 - 09 - 32000 - T LTD - 拒绝

购买 - 12 - 25000 - G Ltd - 完成

卖出 - 15 - 35000 - H Ltd - 完成

DF2

方向用户ID数量公司状态评级

买入 - 12 - 25000 - G Ltd - 完成 - 良好评级

卖出 - 15 - 35000 - H Ltd - 完成 - 良好评级

在此先感谢

到目前为止的代码:

import pandas as pd

fileLocationDF1 = "BBG.csv"
fileLocationDF2 = "corp.csv"

createDf1 = pd.read_csv(fileLocationDF1, low_memory = False)
createDf2 = pd.read_csv(fileLocationDF2, engine='python')

我找到了我认为会有所帮助的 isin 方法,但问题是“用户 ID”列 (df2) 在数据框中有一个空格(如 csv 中的情况)。

createDf1[createDf1.ID.isin(createDf2.columns[2].values)]

当

出现以下错误
AttributeError: 'str' object has no attribute 'values'

我在 isin 方法中传递了列 [2],因为用户 ID 有一个空格

请帮助解决错误以及未读取数据的原因,以便我可以获得一个唯一集,其中来自 df2 的用户 ID 不在 df1 的 ID 中。

See below - the one highligted is the one that is missing in DF2 and I would like this in df3

CParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.

【问题讨论】:

  • 您使用哪些列进行比较? DF1中的所有列?
  • 只是 ID 列
  • @jpp 请看下面
  • 这些列中的哪一个可能是 ID 列?第二个?
  • 是 DF1 中的第二列以及 df2 中的“用户 ID” - 应检查这两列中的数据

标签: python pandas dataframe


【解决方案1】:

我愿意:

import pandas as pd

fileLocationDF1 = "BBG.csv"
fileLocationDF2 = "corp.csv"

createDf1 = pd.read_csv(fileLocationDF1, low_memory = False)
createDf2 = pd.read_csv(fileLocationDF2, engine='python')

# df3 will have createDf1 columns with ID's that are not in createDf2
# ~ means 'not' to the filter
# Acces the column via ['COLUMN NAME'] so you can put spaces into it ;)
df3 = createDf1[~createDf1['ID'].isin(createDf2['User ID'])]

我希望这会有所帮助!

【讨论】:

  • 您好 - 非常感谢您的回复 - 但是,该解决方案似乎不起作用。总共应该有 5642 条不同的记录(通过简单的 v 查找来检查)。但是,使用您的解决方案,我仍然在 df3 中获得与 df2 相同数量的记录。
  • 我正在 Jupyter Notebook 中尝试这个,它似乎可以按我的意愿工作。首先尝试使用 little df's,这样您就可以说服自己这是有效的。将熊猫导入为 pd df1 = pd.DataFrame({'ID': [1,2,3], 'b':[4,5,6], 'c':[7,8,9]}) df2 = pd.DataFrame({'用户 ID': [7,2,5], 'b':[4,5,6], 'c':[7,8,9]}) df3 = df1[~df1[ 'ID'].isin(df2['User ID'])] print(df1) print(df2) print(df3) 对不起,我预计会跳行
  • 我正在使用 spyder - 这些列包含数字作为 ID 和用户 ID - 你认为这会产生影响吗?
  • 我不这么认为,反正它是python。我习惯了python3顺便说一句。尝试使用一些简单的数据框,它将帮助您了解这些功能是如何工作的。
  • 啊,我作为输入使用的文件之一 corp.csv 有问题。我使用 engine = 'python' 绕过原始回溯。如果我卸下引擎,则会收到此错误,这就是我认为 df3 无法正常工作的原因,
猜你喜欢
  • 2018-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2019-07-21
  • 1970-01-01
  • 1970-01-01
  • 2017-04-25
相关资源
最近更新 更多