Сравните один столбец из одного фрейма данных с другим с разными размерами pandas python

#python #pandas #dataframe #for-loop #lambda

Вопрос:

Итак, на основе этих двух фреймов данных панды:

  1. Мне нужно заполнить каждую строку из столбца df1.EmpID, выполнив условие из df1.ElementPage, если оно равно или меньше значения df2.ElementPage, если условие выполнено, заполните значение из df2.EmpID в df1.EmpID

df1:

 |contact      |phone       |ElementPage|empId|
|-------------|------------|-----------|-----|
|Silvia Smith |513-123-4567|2          |     |
|Barbara Smith|513-123-4567|4          |     |
|Leimomi Yang |513-123-4567|6          |     |
|SaraSmith    |513-123-4567|8          |     |
|Naomi Thomas |513-123-4567|10         |     |
|Margot Thomas|513-123-4567|10         |     |
|Bill Anderson|513-123-4567|16         |     |
 

df2:

 |empId  |ElementPage|
|-------|-----------|
|7      |1          |
|81     |3          |
|52     |5          |
|94     |7          |
|85     |9          |
|143    |11         |
|102    |13         |
|3      |15         |
|112    |17         |
|9      |19         |
 

как предположить, что это будет выход:

 |contact      |phone       |ElementPage|empId|
|-------      |-----       |-----------|-----|
|Silvia Smith |513-123-4567|2          |7    |
|Barbara Smith|513-123-4567|4          |81   |
|Leimomi Yang |513-123-4567|6          |52   |
|SaraSmith    |513-123-4567|8          |94   |
|Naomi Thomas |513-123-4567|10         |85   |
|Margot Thomas|513-123-4567|10         |85   |
|Bill Anderson|513-123-4567|16         |3    |
 

Я попробовал что-то вроде:

 df1['empId'] = df1['empId'].apply(lambda x: x[df2['ElementText']] if x['ElementPage'] >= x[df2['ElementPage']] else 'No empId')
 

но показывает мне эту ошибку:

 TypeError: 'bool' object is not subscriptable
 

Чтобы учесть: df не имеют одинакового размера и индексов на обоих начинается с «0».

Ответ №1:

IIUC вы хотите объединить на ближайшем более высоком или равном значении «Страницы элементов» в df2. Для этого вы можете использовать pandas.merge_asof :

 pd.merge_asof(df1.drop('empId', axis=1), df2, on='ElementPage')
 

выход:

          contact         phone  ElementPage  empId
0   Silvia Smith  513-123-4567            2      7
1  Barbara Smith  513-123-4567            4     81
2   Leimomi Yang  513-123-4567            6     52
3      SaraSmith  513-123-4567            8     94
4   Naomi Thomas  513-123-4567           10     85
5  Margot Thomas  513-123-4567           10     85
6  Bill Anderson  513-123-4567           16      3
 

Комментарии:

1. Я не уверен, почему мой ответ не прошел через это, я проверял свой пост и перепроверял, и О! Я просто хочу сказать спасибо, потому что твой ответ действует как заклинание. Еще раз спасибо.

2. @lug0lug0 ты хочешь сказать, что не видел, чтобы кто-то ответил? Если это решение сработало для вас, вы можете рассмотреть возможность принятия ответа 😉