Pandas | 数据分析时将特定列转换为数字类型 float64 或 int64的方法
类型转换
- 传统方法astype
- 使用value_counts统计
- 通过apply替换并使用astype转换
- pd.to_numericx对连续变量进行转化⭐
- 参数:
- 返回值:
- 示例代码:
- isnull不会检查空字符串
- 数据准备
有一组数据信息如下,其中主要将TotalCharges
、MonthlyCharges
两列进行类型转换,虽然通过函数info查看到类型已经是float64 和int64了,但是其中存在缺失值
,我们的目的是找出缺失值 并填补进行类型转换
tcc.info()
传统方法astype
def find_index(data_col, val):"""查询某值在某列中第一次出现位置的索引,没有则返回-1:param data_col: 查询的列:param val: 具体取值"""val_list = [val]if data_col.isin(val_list).sum() == 0:index = -1else:index = data_col.isin(val_list).idxmax()# idxmax 方法将返回第一个匹配值的索引return index
# 查看空格第一次出现在哪一列的哪个位置:
for col in numeric_cols:print(find_index(tcc[col], ' '))
-1
488
# -1 代表月费用是没有问题的 488 代表总费用是有问题 且是空值
tcc["TotalCharges"][480:490]
# 确认是空值
tcc["TotalCharges"].iloc[488]
’ ’ 【有个空格的哦】
使用value_counts统计
tcc["TotalCharges"].value_counts()
通过apply替换并使用astype转换
tcc['TotalCharges']=tcc['TotalCharges'].apply(lambda x: x if x != ' ' else np.nan).astype(float)
tcc['MonthlyCharges']=tcc['MonthlyCharges'].astype(float)
根据上述方法,将空字符串替换为NaN,这就方便使用isnull函数进行后续处理
def missing (df):"""计算每一列的缺失值及占比"""missing_number = df.isnull().sum().sort_values(ascending=False) # 每一列的缺失值求和后降序排序 missing_percent = (df.isnull().sum()/df.isnull().count()).sort_values(ascending=False) # 每一列缺失值占比missing_values = pd.concat([missing_number, missing_percent], axis=1, keys=['Missing_Number', 'Missing_Percent']) # 合并为一个DataFramereturn missing_valuesmissing(tcc[numeric_cols])
tcc["TotalCharges"].isnull().sum()
11
# 输出缺失值位置对应的索引
tcc.index[tcc["TotalCharges"].isnull()].tolist()
[488, 753, 936, 1082, 1340, 3331, 3826, 4380, 5218, 6670, 6754]
pd.to_numericx对连续变量进行转化⭐
pd.to_numeric
是 pandas
库中的一个函数,用于将参数转换为数字类型。这个函数的默认返回类型是 float64
或 int64
,具体取决于提供的数据。以下是 pd.to_numeric
的一些关键用法和参数:
参数:
- arg:要转换的参数,可以是标量、列表、元组、一维数组或
Series
。 - errors:{‘ignore’, ‘raise’, ‘coerce’},默认为 ‘raise’。
- 如果设置为 ‘raise’,则无效的解析会引发异常。
- 如果设置为 ‘coerce’,则无效的解析会被设置为
NaN
。 - 如果设置为 ‘ignore’,则无效的解析会返回输入的原始值。注意,‘ignore’ 在版本 2.2 中已被弃用,建议显式捕获异常。
- downcast:默认为 None。
- 可以是 ‘integer’、‘signed’、‘unsigned’ 或 ‘float’。
- 如果不为 None,并且数据已成功转换为数值类型,则根据规则将结果数据转换为可能的最小数值类型。
- dtype_backend:{‘numpy_nullable’, ‘pyarrow’},默认为 ‘numpy_nullable’。
- ‘numpy_nullable’:返回支持空值的
DataFrame
(默认)。 - ‘pyarrow’:返回基于
pyarrow
的可空ArrowDtype
DataFrame
。
- ‘numpy_nullable’:返回支持空值的
返回值:
- 如果解析成功,返回数字。返回类型取决于输入。如果是
Series
,则返回Series
;否则返回ndarray
。
示例代码:
# 将 Series 转换为数值类型
s = pd.Series(['1.0', '2', -3])
pd.to_numeric(s) # 返回 float64 类型
# 使用 downcast 参数将数值类型转换为更小的数值类型
pd.to_numeric(s, downcast='float') # 返回 float32 类型
# 使用 errors 参数处理非数值数据
s = pd.Series([None, ' ', np.nan,'2', -3])
pd.to_numeric(s, errors='coerce') # 非数值数据被替换为 NaN
pd.to_numeric
是处理数据转换时非常有用的工具,尤其是在数据清洗和预处理阶段,它可以帮助确保数据类型的一致性。更多详细信息和用法可以参考 pandas 官方文档 。
isnull不会检查空字符串
- 没有空字符
s = pd.Series([None, np.nan, '2', -3])
s
s.isnull().sum()
2
- 空字符串存在
t = pd.Series([None, ' ', '2', -3])
t
t.isnull()
0 True
1 False
# 空字符当成有数据处理了
2 False
3 False
dtype: bool
t.isnull().sum()
1