对整个 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
此处每列至少替换一个值,因此整数列被转换为浮点数(因为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
正在尝试对数据集进行一些清理,而不是在熊猫系列上提供条件
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
此处每列至少替换一个值,因此整数列被转换为浮点数(因为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