在Pandas DataFrame生成平方特征遇NaN及列数过多问题求助
问题分析与解决办法
为什么会出现NaN?
- 原数据本身存在NaN值:只要参与相乘的任意一行有NaN,计算结果就会是NaN
- 索引对齐问题:如果用
iloc[i]取行时,两行的索引无法完全匹配,缺失的位置会生成NaN - 数据类型错误:如果某列是字符串等非数值类型,和数值列相乘会直接产生NaN
为什么列数暴增到5563?
你写的df.iloc[i]和df.iloc[j]取的是行数据,不是列!如果你的DataFrame有几百行,循环遍历行索引i和j的话,每一次循环都会新增一列两行相乘的结果,自然会生成海量列。而你的需求是生成列间的乘积特征(平方特征),应该遍历列索引才对。
正确实现代码
# 先筛选出所有数值类型的列,避免非数值列干扰 numeric_cols = df.select_dtypes(include=['int64', 'float64']).columns col_count = len(numeric_cols) # 遍历列的两两组合(包含自身相乘,即平方特征),避免重复生成相同乘积列 for i in range(col_count): for j in range(i, col_count): col1 = numeric_cols[i] col2 = numeric_cols[j] # 给新列起清晰的命名 new_col = f"{col1}_times_{col2}" df[new_col] = df[col1] * df[col2]
处理NaN的建议
- 先清理原数据:用
df.fillna(0)或df.fillna(df.mean())填充NaN,或者用df.dropna()删除含NaN的行/列 - 操作前确认所有参与计算的列都是数值类型:可以用
df.dtypes查看列类型,非数值列转成数值或直接排除
内容的提问来源于stack exchange,提问作者Ashutosh Singh
相关产品推荐
相关产品推荐

