Нарезка на весь фрейм данных panda вместо серии приводит к изменению типа данных и присвоению значений первого поля NaN, что происходит?

#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