У меня есть 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
Пожалуйста, покажите код, который вы пробовали, который вызвал ошибку. Кроме того, вы пытаетесь сравнить строки и числа.
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
но
col1
содержит строки!