如何在Pandas中为含缺失值的列表数据自动匹配正确数值类型?
解决Pandas DataFrame列类型全为object的数值转换问题
这个问题很常见——当你的数据里混有空字符串和数值格式的字符串时,Pandas会默认把列设为object类型。不过有几种简单的方法可以帮你把数值列转成正确的int/float类型,同时处理那些缺失值,我给你详细说下:
方法一:用pd.to_numeric手动转换(灵活可控)
首先要处理数据里的空字符串'',因为Pandas不会把它识别为缺失值NaN,直接转换会报错。我们先把空字符串替换成NaN,再逐列尝试转换为数值类型:
import pandas as pd import numpy as np # 第一步:将所有空字符串替换为NaN,这是转换数值类型的前提 df = df.replace('', np.nan) # 第二步:遍历每一列,尝试转换为数值类型 for col in df.columns: try: # 尝试转换,无法转换的(比如时间列)会抛出ValueError,我们跳过 df[col] = pd.to_numeric(df[col]) except ValueError: continue # 查看转换后的列类型 print(df.dtypes)
如果你想更简洁,可以用apply配合errors='ignore'参数——这个参数会让无法转换的列保持原类型:
df = df.replace('', np.nan) df = df.apply(lambda x: pd.to_numeric(x, errors='ignore') if x.dtype == object else x)
方法二:用convert_dtypes自动推断(懒人友好)
Pandas 1.0+版本提供了convert_dtypes方法,它会自动推断每列最合适的类型,包括支持缺失值的Nullable整数类型(比如Int64,注意大写I,和普通int64的区别是可以存NaN):
import pandas as pd import numpy as np # 同样先替换空字符串为NaN df = df.replace('', np.nan) # 自动转换类型 df = df.convert_dtypes() print(df.dtypes)
这个方法的好处是不用手动判断哪些列是数值型,Pandas会帮你搞定,而且会优先用支持缺失值的Nullable类型,避免把整数列转成float类型(因为普通int不能存NaN,只能转成float)。
额外:处理时间列
你的数据里有Time列,它是时间格式的字符串,可以单独转成datetime类型:
df['Time'] = pd.to_datetime(df['Time'], format='%H:%M:%S.%f')
内容的提问来源于stack exchange,提问作者user3206440
相关产品推荐
相关产品推荐

