我有两个像这样定义的pandas数据帧:
_data_orig = [
[1, "Bob", 3.0],
[2, "Sam", 2.0],
[3, "Jane", 4.0]
]
_columns = ["ID", "Name", "GPA"]
_data_new = [
[1, "Bob", 3.2],
[3, "Jane", 3.9],
[4, "John", 1.2],
[5, "Lisa", 2.2]
]
_columns = ["ID", "Name", "GPA"]
df1 = pd.DataFrame(data=_data_orig, columns=_columns)
df2 = pd.DataFrame(data=_data_new, columns=_columns)
我需要找到以下信息:
对于查找行变化的操作,我想我可以查看df2并检查df1,但这似乎很慢,所以我希望在那里找到更快的解决方案。
对于其他两个操作,我真的不知道该怎么做,因为当我尝试比较我得到的两个数据帧时:
ValueError: Can only compare identically-labeled DataFrame objects
熊猫版:'0.16.1'
建议?
答案 0 :(得分:5)
设置
m = df1.merge(df2, on=['ID', 'Name'], how='outer', suffixes=['', '_'], indicator=True)
m
添加
m.loc[m._merge.eq('right_only')]
或
m.query('_merge == "right_only"')
删除
m.loc[m._merge.eq('left_only')]
或
m.query('_merge == "left_only"')
0.16.1
回答
设置
m = df1.merge(df2, on=['ID', 'Name'], how='outer', suffixes=['', '_'])
m
添加
m.loc[m.GPA_.notnull() & m.GPA.isnull()]
删除
m.loc[m.GPA_.isnull() & m.GPA.notnull()]
答案 1 :(得分:0)
这样做:
df1.set_index(['Name','ID'])-df2.set_index(['Name','ID'])
Out[108]:
GPA
Name ID
Bob 1 -0.2000
Jane 3 0.1000
John 4 nan
Lisa 5 nan
Sam 2 nan
如果df1和df2之间存在差异,将允许您进行筛选。 NaN表示不相交的值