我有一个示例数据框df1
id user_id name email
1 1 John John@example.com
2 2 Alves alves@example.com
3 3 Kristein kristein@example.com
4 4 James james@example.com
第二数据帧df2
id user user_email_1 user_email_2 status
1 Sanders sanders@example.com active
2 Alves alves111@example.com alves@example.com active
3 Micheal micheal@example.com active
4 James james@example.com delete
如何将df2
的状态数据添加到df1
df1
的user_id
和df2
的id
df1
的name
和df2
的user
df1
的email
与user_email_1
匹配或df2
的user_email_2
匹配并删除不匹配的记录?
期望结果df1
:
id user_id name email status
2 2 Alves alves@example.com active
4 4 James james@example.com delete
例如:
由于df1
中的alves@example.com
与user_email_2
匹配,因此附加了状态数据。
您应该使用merge
df1.merge(df2.reset_index(), how='inner', left_on=['name', 'email', 'id'], right_on=['user', 'user_email', 'index'])
重新安排你的数据框df2
,只得到一个user_email
列,然后合并两个数据框,并保留想要的列:
df2 = df2.set_index(['id', 'user', 'status']).stack()
.rename('user_email').reset_index()
out = pd.merge(df1, df2, left_on=['user_id', 'name', 'email'],
right_on=['id', 'user', 'user_email'],
suffixes=('', '2'))
[['id', 'user_id', 'name', 'email', 'status']]
>>> out
id user_id name email status
0 2 2 Alves alves@example.com active
1 4 4 James james@example.com delete
在哪里使用列user_email_2
列user_email_1
和user_email_2
被堆叠成一列。转换之后,df2
看起来像:
>>> df2
id user status level_3 user_email
0 1 Sanders active user_email_1 sanders@example.com
1 2 Alves active user_email_1 alves111@example.com
2 2 Alves active user_email_2 alves@example.com
3 3 Micheal active user_email_1 micheal@example.com
4 4 James delete user_email_1 james@example.com