#python #pandas #dataframe #for-loop #lambda
Вопрос:
Итак, на основе этих двух фреймов данных панды:
- Мне нужно заполнить каждую строку из столбца 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 ты хочешь сказать, что не видел, чтобы кто-то ответил? Если это решение сработало для вас, вы можете рассмотреть возможность принятия ответа 😉