对整个 pandas 数据帧进行切片而不是对系列进行切片会导致数据类型发生变化,并将第一个字段的值分配给 NaN,这是怎么回事?

Slicing on entire panda dataframe instead of series results in change of data type and values assignment of first field to NaN, what is happening?

正在尝试对数据集进行一些清理,而不是在熊猫系列上提供条件
head_only[head_only.BasePay > 70000]
我在数据框上应用了条件
head_only[head_only > 70000]
附上我观察的图像,任何人都可以帮助我理解发生了什么事吗?

如果带有字符串列的数字出现错误,您的第二个解决方案将引发错误:

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])

TypeError: '>' not supported between instances of 'str' and '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

此处每列至少替换一个值,因此整数列被转换为浮点数(因为NaNfloat):

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