#python #pandas
#python #pandas
Вопрос:
У меня есть следующий фрейм данных df
:
col1 col2 col3
50 dd 3
2 r NaN
5 d 4
a e 5
Мне нужно вычислить среднее значение для выбранных столбцов cols
. И затем я должен проверить, не отклоняется ли какое-либо из значений в выбранных строках от среднего значения более чем на 20%.
Я не уверен, как использовать смешанные значения в одной строке для выполнения этих вычислений.
def test_row(x, threshold):
if x.dtype == int or x.dtype == float:
return x > threshold
columns = ["col1", "col3"]
for col in columns:
threshold = df[col].median()*(20/100)
check = df.apply(lambda x: test_row(x[col], threshold), axis=1)
print(check.any())
Однако это, очевидно, завершается неудачей, потому что if x.dtype == int or x.dtype == float
не работает.
Комментарии:
1. ваш код выдает ошибку значения здесь:
threshold = df[col].median()*(20/100)
еще до запуска функции2. Спасибо @Chris. Вы знаете, как это исправить? Я не хочу заменять NaN на 0. Просто чтобы пропустить их.
3. Проблема, о которой сообщил @ Chris, заключается в том, что в col1 есть ‘a’. Вы можете исправить изменение столбца типа, используя
pd.to_numeric(df['col1'], errors='coerce')
4. @Terry. Будет ли этот код просто возвращать все числовые значения?
5. он преобразует в числовое значение, то, что он не может преобразовать, вернет как NaN
Ответ №1:
Ваша функция может быть:
def test_row(x, threshold):
if isinstance(x,(int,float)) and x:
return x > threshold
Вторая логика в функции предназначена только для проверки, содержит ли x что-либо, если оно пустое, оно вернет False.