使用pandas-Python比较两个数据帧以返回新的数据帧

使用pandas-Python比较两个数据帧以返回新的数据帧,python,pandas,dataframe,Python,Pandas,Dataframe,我需要你的帮助 我有两个从CSV创建的数据帧,我需要返回一个新的数据帧,它将是特定字段/列上这两个数据帧之间的差异。例如,如果来自df1的ID不在df2中,那么df3应该为我提供来自df1的所有不在df2中的列和行 注:df1和df2列不相同,即df1的列数可能多于或少于df2,但df3中的列数应为d1。此外,ID(来自df1)和用户ID(df2)值将成为协调因素,字段中的数据将是公共因素,但实际字段名称不同 请提前道歉,因为下表不清楚。所以在下面的示例中,df1中的第一行不在df2中,df3应

我需要你的帮助

我有两个从CSV创建的数据帧,我需要返回一个新的数据帧,它将是特定字段/列上这两个数据帧之间的差异。例如,如果来自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有限公司-拒绝

购买-12-25000-G有限公司-完成

销售-15-35000-H有限公司-完成

DF2

方向用户ID数量公司状态评级 购买-12-25000-G有限公司-完成-良好评级

销售-15-35000-H有限公司-完成-良好评级

非常感谢

迄今为止的代码:

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中的情况一样)

我得到下面的错误,当

AttributeError: 'str' object has no attribute 'values'
我在isin方法中传递了列[2],因为用户ID有一个空格

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

我会:

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'])]

我希望这有帮助

您使用哪些列进行比较?
DF1
中的所有列?只有IDcolumn@jpp请参见下文,其中哪些列可能是ID列?第二个?是的,DF1中的第二列以及df2中的“用户ID”-应该对这两列中的数据进行检查Shello-非常感谢您的回复-但是,解决方案似乎不起作用。总共应该有5642条不同的记录(通过简单的v查找进行检查)。但是,使用您的解决方案,我在df3中获得的记录数仍然与df2中的记录数相同。我正在Jupyter笔记本中尝试这一点,它似乎可以按照我的意愿工作。首先尝试一下小df,这样你就可以说服自己它正在工作。导入熊猫作为pd df1=pd.DataFrame({'ID':[1,2,3],'b':[4,5,6],'c':[7,8,9]})df2=pd.DataFrame({'User ID':[7,2,5],'b':[4,5,6],'c':[7,8,9]})df3=df1[~df1['ID'].isin(df2['User ID'])]打印(df1)打印(df3)对不起,我想我正在使用spyder-列包含数字作为ID和用户ID-你认为这会有影响吗?我不这么认为,反正是python。顺便说一句,我已经习惯python3了。用一些简单的数据帧试试,它会帮助你了解这些函数是如何工作的。啊,我使用的一个文件corp.csv存在问题。我使用engine='python'来绕过原始的回溯。如果我拆下引擎,就会出现这个错误,这就是为什么我认为df3不是wokring,
CParserError: Error tokenizing data. C error: Buffer overflow caught - possible malformed input file.
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'])]