Python pandas. Замена значения столбца на среднее значение по двум столбцам
Подскажите, пожалуйста. У меня есть таблица:
| | Id | Name | City | Address | Numb |
|----|----|------|------|---------|------|
| 0 | 0 | Аб | Пит | Ацыа | 1.0 |
| 1 | 1 | Ва | Моск | ываыв | 2.0 |
| 2 | 2 | Аб | Пит | ыаыв | NaN |
| 3 | 3 | Ге | Дне | цуцк | 3.0 |
| 4 | 4 | Се | Уф | йыв | 2.0 |
| 5 | 5 | Аб | Моск | ЫВАыва | 2.0 |
| 6 | 6 | Ва | Уф | ЫВАыв | 2.0 |
| 7 | 7 | Аб | Пит | Ыа 123 | 1.0 |
| 8 | 8 | Де | Кип | ыфа 2ц3 | 5.0 |
| 9 | 9 | Аб | Пит | Ука 2 | -1.0 |
| 10 | 10 | МРЕ | Кип | ыва 2 | 3.0 |
Мне нужно заменить все значения в колонке Numb, которые не удовлетворяют условию Numb = (1,2,3). Заменить нужно на наиболее часто встречающимся значением по колонке Numb и City. Т.е для Id = 2, Numb = 1, т.к. для City Пит значения Num = 1, 1, -1 (наиболее часто встречающиеся 1). Были попытки что-то типа такого:
for idx, row in S1[-S1['Numb'].isin([1, 2, 3])].iterrows():
S1.at[idx, 'Numb'] = S1[S1['City'] == S1.at[idx, 'City']] == S1.at[idx]['Numb'].mode()[0]
Вылетает с ошибкой: TypeError: _get_value() missing 1 required positional argument: 'col' Заранее спасибо :)
Ответы (1 шт):
Я бы советовал избегать iterrows вообще, так как это один из самых неэффективных методов pandas. Кроме того, вашу задачу можно решить векторизированными способами pandas, не прибегая к циклу:
Исходный df:
Id Name City Address Numb
0 0 Аб Пит Ацыа 1.0
1 1 Ва Моск ываыв 2.0
2 2 Аб Пит ыаыв NaN
3 3 Ге Дне цуцк 3.0
4 4 Се Уф йыв 2.0
5 5 Аб Моск ЫВАыва 2.0
6 6 Ва Уф ЫВАыв 2.0
7 7 Аб Пит Ыа_123 1.0
8 8 Де Кип ыфа_2ц3 5.0
9 9 Аб Пит Ука_2 -1.0
10 10 МРЕ Кип ыва_2 3.0
Преобразуем, принимая во внимание, что моду нужно считать без учета выпадающих из промежутка (1, 2, 3) чисел, если я вас правильно понял, а не так, как это делаете вы:
df.loc[~df['Numb'].isin((1,2,3)), 'Numb']=np.nan
df['mode'] = df.groupby('City')['Numb'].transform(lambda x:x.value_counts().index[0])
df['Numb'].fillna(df['mode'], inplace=True)
Получаем результат. колонку с модой можно удалить по желанию:
Id Name City Address Numb mode
0 0 Аб Пит Ацыа 1.0 1.0
1 1 Ва Моск ываыв 2.0 2.0
2 2 Аб Пит ыаыв 1.0 1.0
3 3 Ге Дне цуцк 3.0 3.0
4 4 Се Уф йыв 2.0 2.0
5 5 Аб Моск ЫВАыва 2.0 2.0
6 6 Ва Уф ЫВАыв 2.0 2.0
7 7 Аб Пит Ыа_123 1.0 1.0
8 8 Де Кип ыфа_2ц3 3.0 3.0
9 9 Аб Пит Ука_2 1.0 1.0
10 10 МРЕ Кип ыва_2 3.0 3.0