数据框如下:
col1 col2 col3 col4 col5 col6 col7
points
x1 0.6 '0' 'first' 0.93 'lion' 0.34 0.98
x2 0.7 '1' 'second' 0.47 'cat' 0.43 0.76
x3 NaN '0' 'third' 0.87 'tiger' 0.24 0.10
x4 0.6 '0' 'first' 0.93 'lion' 0.34 0.98
x5 0.5 '1' 'first' 0.32 NaN 0.09 NaN
x6 0.4 '0' 'third' 0.78 'tiger' 0.18 0.17
x7 0.5 '1' 'second' 0.98 'cat' 0.47 0.78
numeric=df.select_dtypes(include=["number"])
others=df.select_dtypes(exclude=["number"])
print(numeric)
output:
col4 col6
points
x1 0.93 0.34
x2 0.47 0.43
x3 0.87 0.24
x4 0.93 0.34
x5 0.32 0.09
x6 0.78 0.18
x7 0.98 0.47
但是我需要输出像:
col1 col4 col6 col7
points
x1 0.6 0.93 0.34 0.98
x2 0.7 0.47 0.43 0.76
x3 NaN 0.87 0.24 0.10
x4 0.6 0.93 0.34 0.98
x5 0.5 0.32 0.09 NaN
x6 0.4 0.78 0.18 0.17
x7 0.5 0.98 0.47 0.78
我了解到NaN被视为对象,并且这些列已被移动others
。如何甚至根据列中的值检测列?
答案 0 :(得分:1)
您的问题可以归结为:
如何将 meant 的列转换为数字列,但当前具有
object
dtype。
此问题解决后,pd.DataFrame.select_dtypes
将可以正常工作。含义是您事先不知道哪个系列是数字。但是您可以做的是 try 并将列转换为当前具有object
dtype的数字。如果找到任何非空值,则可以应用转换。
for col in df.select_dtypes(include=['object']):
s = pd.to_numeric(df[col], errors='coerce')
if s.notnull().any():
df[col] = s
print(df.dtypes)
points object
col1 float64
col2 object
col3 object
col4 float64
col5 object
col6 float64
col7 float64
dtype: object
该逻辑将适用于您提供的数据。例如,当您有一系列主要由字符串和一些数字组成的字符串时,它将不起作用。在这种情况下,您将需要定义更精确的逻辑,以确定应该将哪个系列视为数字。