Изменить значения в строке pandas df на основе условия

У меня есть df, как показано ниже, и мне нужно изменить значение одной из строк на основе условия, чтобы, если оно> 20, оно было изменено на 20.

      col1 col2  col3  col4  col5  col6
row1  str1  str   15.3   25.6   3.5   4.5
row2  str2  str   25.8   55.4   4.5   55
row3  str3  str   35.3   45.8   7.5   65
row4  str4  str   45.2   55.7   6.5   7.5

Для столбцов я пробовал следующее и работал:

df.col1 = np.where(df.col1 > 20, 20, df.col1)

Однако для строк я пробовал несколько строк с loc и mask, но это просто не работает. Если мы возьмем ожидаемый результат row3:

  col1 col2  col3  col4  col5  col6
row1  str1  str   15.3   25.6   3.5   4.5
row2  str2  str   25.8   55.4   4.5   55
row3  str3  str   20.0   20.0   7.5   20
row4  str4  str   45.2   55.7   6.5   7.5

но col1 содержит строки!

mozway 21.03.2022 17:14

Пожалуйста, покажите код, который вы пробовали, который вызвал ошибку. Кроме того, вы пытаетесь сравнить строки и числа.

Nathan Furnal 21.03.2022 17:15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
2
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

IIUC, это должно работать. Вы можете использовать to_numeric для получения числовых значений, clip для изменения значений и fillna для возврата строковых значений:

df.loc['row3'] = pd.to_numeric(df.loc['row3'], errors='coerce').clip(upper=20).fillna(df.loc['row3'])

Выход:

      col1 col2  col3  col4  col5  col6
row1  str1  str  15.3  25.6   3.5   4.5
row2  str2  str  25.8  55.4   4.5  55.0
row3  str3  str  20.0  20.0   7.5  20.0
row4  str4  str  45.2  55.7   6.5   7.5

Таким образом, вы можете сделать df.clip после выбора dtypes, а затем comb_first:

rows = ['row3'] #more row indices here in a list
df_out = df.select_dtypes('number').clip(upper=20).loc[rows].combine_first(df)

print(df_out)

      col1 col2  col3  col4  col5  col6
row1  str1  str  15.3  25.6   3.5   4.5
row2  str2  str  25.8  55.4   4.5  55.0
row3  str3  str  20.0  20.0   7.5  20.0
row4  str4  str  45.2  55.7   6.5   7.5

Другие вопросы по теме