Возвращаемое значение, основанное на условном поиске в разных пирамидах. - PullRequest
0 голосов
/ 26 августа 2018

Цель: найти значение из одного фрейма данных (условно) и поместить результаты в другой фрейм данных с новым именем столбца

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" и заполнить только "priority_rank" на основе условного поиска в df_1, а именно:

  • user_id должен совпадать между df_1 и df_2
  • Меня интересует только df_1 ['name'] == 'abc', все остальное должно быть пустым

df_2 должен выглядеть так:

|user_id|priority_rank|
     1     6
     2     
     3
     4     9
     5     10

Ответы [ 3 ]

0 голосов
/ 26 августа 2018

Один из способов сделать это:

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'.Я предполагаю, что это не всегда будет так.

0 голосов
/ 26 августа 2018

Использование 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
0 голосов
/ 26 августа 2018

Вы ищете 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
...