Return 基于不同 Pandas DataFrame 条件查找的值
Return Value Based on Conditional Lookup on Different Pandas DataFrame
Objective:从一个数据框中查找值(有条件地)并将结果放入具有新列名称的不同数据框中
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",即以下内容:
- user_id 必须在 df_1 和 df_2
之间匹配
- 我只对df_1['name']感兴趣 == 'abc'其他都应该是空白
df_2 应该看起来像这样:
|user_id|priority_rank|
1 6
2
3
4 9
5 10
您正在寻找 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
一种方法:
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'
时都是相同的。我假设情况并非总是如此。
使用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
Objective:从一个数据框中查找值(有条件地)并将结果放入具有新列名称的不同数据框中
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",即以下内容:
- user_id 必须在 df_1 和 df_2 之间匹配
- 我只对df_1['name']感兴趣 == 'abc'其他都应该是空白
df_2 应该看起来像这样:
|user_id|priority_rank|
1 6
2
3
4 9
5 10
您正在寻找 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
一种方法:
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'
时都是相同的。我假设情况并非总是如此。
使用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