我每天收到2个包含2列的csv文件。一个具有唯一标识符,另一个具有值。我试图比较每个标识符的值,并保留值已更改的那些行。
Id1 Value_Yesterday
abc 500
def 650
ghi 750
jkl 800
mno 900
和
Id1 Value
def 650
ghi 750
mno 900
所需的输出是
df4 = df1.merge(df2,how='outer',on='Id1')
df4['check']=df4.Value_today==df4.Value_Yesterday
df4 = df4[df4['check'] == False]
到目前为止,我已经尝试过:
fp
但是这会返回一个空的数据帧。 我做错了吗?
答案 0 :(得分:1)
我这样做:
In [11]: d1
Out[11]:
Id1 Value
0 abc 500
1 def 600
2 ghi 700
3 jkl 800
In [12]: d2
Out[12]:
Id1 Value
0 abc 500
1 def 650
2 ghi 750
3 jkl 800
4 mno 900
In [13]: %paste
r = pd.concat([d1.assign(x='old'), d2.assign(x='new')], ignore_index=True) \
.drop_duplicates(subset=['Id1','Value'], keep=False) \
.set_index(['Id1','x']) \
.unstack() \
.reset_index()
r.columns = [col[1] if col[1] else col[0] for col in r.columns]
## -- End pasted text --
结果:
In [16]: r
Out[16]:
Id1 new old
0 def 650.0 600.0
1 ghi 750.0 700.0
2 mno 900.0 NaN
In [17]: r[['Id1','old','new']]
Out[17]:
Id1 old new
0 def 600.0 650.0
1 ghi 700.0 750.0
2 mno NaN 900.0
更通用的案例(有多列):
In [27]: d1
Out[27]:
ID a b c
0 1 1 2 3
1 2 4 5 6
2 3 7 8 9
In [28]: d2
Out[28]:
ID a b c
0 1 1 2 3
1 2 4 0 6
2 3 7 8 10
3 4 1 1 1
In [29]: %paste
r = pd.concat([d1.assign(x='old'), d2.assign(x='new')], ignore_index=True) \
.drop_duplicates(subset=d1.columns.tolist(), keep=False) \
.set_index(['ID','x']) \
.unstack() \
.reset_index()
## -- End pasted text --
In [30]: r
Out[30]:
ID a b c
x new old new old new old
0 2 4.0 4.0 0.0 5.0 6.0 6.0
1 3 7.0 7.0 8.0 8.0 10.0 9.0
2 4 1.0 NaN 1.0 NaN 1.0 NaN