#pandas #dataframe #nan
#pandas #фрейм данных #nan
Вопрос:
Пытался выполнить некоторую очистку набора данных, где вместо этого задается условие для серии panda
head_only[head_only.BasePay > 70000]
Я применил условие к фрейму данных
head_only[head_only > 70000]
прикрепленные изображения моего наблюдения, кто-нибудь может помочь мне понять, что происходит?
Комментарии:
1. итак, если использовать
head_only[head_only > 70000]
, то оно не возвращаетсяTypeError: '>' not supported between instances of 'str' and 'int'
или аналогично?
Ответ №1:
Ваше второе решение вызывает ошибку, если числовые столбцы со строками:
df = pd.DataFrame({
'A':list('abcdef'),
'B':[4,5,4,5,5,4],
'C':[7,8,9,4,2.0,3],
'D':[1,3,5,7,1,0],
'E':[5,3,6,9,2,4],
'F':list('aaabbb')
})
print (df[df > 5])
Ошибка типа: ‘>’ не поддерживается между экземплярами ‘str’ и ‘int’
Если сравнивать только числовые столбцы, он получает значения выше, 4
а все остальные числа преобразуются в неправильные значения:
df1 = df.select_dtypes(np.number)
print (df1[df1 > 4])
B C D E
0 NaN 7.0 NaN 5.0
1 5.0 8.0 NaN NaN
2 NaN 9.0 5.0 6.0
3 5.0 NaN 7.0 9.0
4 5.0 NaN NaN NaN
5 NaN NaN NaN NaN
Здесь заменяется хотя бы одно значение в каждом столбце, поэтому столбцы целых чисел преобразуются в числа с плавающей запятой (потому NaN
что есть float
):
print (df1[df1 > 4].dtypes)
B float64
C float64
D float64
E float64
dtype: object
При необходимости сравните все числовые столбцы, если хотя бы один из них соответствует условию, используемому DataFrame.any
для проверки, если хотя бы одно значение True
:
#returned boolean DataFrame
print ((df1 > 7))
B C D E
0 False False False False
1 False True False False
2 False True False False
3 False False False True
4 False False False False
5 False False False False
print ((df1 > 7).any(axis=1))
0 False
1 True
2 True
3 True
4 False
5 False
dtype: bool
print (df1[(df1 > 7).any(axis=1)])
B C D E
1 5 8.0 3 3
2 4 9.0 5 6
3 5 4.0 7 9
Или, если требуется фильтровать исходные все столбцы, можно фильтровать только числовые столбцы по DataFrame.select_dtypes
:
print (df[(df.select_dtypes(np.number) > 7).any(axis=1)])
A B C D E F
1 b 5 8.0 3 3 a
2 c 4 9.0 5 6 a
3 d 5 4.0 7 9 b