目标:(有条件地)从一个数据帧中查找值并将结果放置在具有新列名的另一数据帧中
df_1 = pd.DataFrame({'user_id': [1,2,1,4,5],
'name': ['abc','def','ghi','abc','abc'],
'rank': [6,7,8,9,10]})
df_2 = pd.DataFrame ({'user_id': [1,2,3,4,5]})
df_1 # original data
df_2 # new dataframe
在这个一般示例中,我试图创建一个名为“ priority_rank”的新列,并仅基于针对df_1的条件查找来填充“ priority_rank”:
df_2应该看起来像这样:
|user_id|priority_rank|
1 6
2
3
4 9
5 10
答案 0 :(得分:4)
一种方法:
In []:
df_2['priority_rank'] = np.where((df_1.name=='abc') & (df_1.user_id==df_2.user_id), df_1['rank'], '')
df_2
Out[]:
user_id priority_rank
0 1 6
1 2
2 3
3 4 9
4 5 10
注意:在您的示例中,df_1.name=='abc'
是足够的条件,因为user_id
时df_1.name=='abc'
的所有值都相同。我假设情况并非总是如此。
答案 1 :(得分:2)
使用merge
df_2.merge(df_1.loc[df_1.name=='abc',:],how='left').drop('name',1)
Out[932]:
user_id rank
0 1 6.0
1 2 NaN
2 3 NaN
3 4 9.0
4 5 10.0
答案 2 :(得分:1)
您正在寻找map
:
df_2.assign(priority_rank=df_2['user_id'].map(
df_1.query("name == 'abc'").set_index('user_id')['rank']))
user_id priority_rank
0 1 6.0
1 2 NaN
2 3 NaN
3 4 9.0
4 5 10.0