机器学习模型DataFrame分组异常:df2丢失L与400列求助
问题分析与解决办法
核心异常原因
- 数据类型不匹配:虽然df1和df2列名完全一致,但df2的
L和400列大概率是object(字符串)类型,而groupby.mean()只会对数值型(int/float)列执行计算,非数值列会被自动过滤。df1的这两列是数值型,所以能被保留。 - 全空值导致列被丢弃:df2的
L或400列在所有分组中都是空值(NaN),部分场景下pandas会自动移除全NaN的列。 - 分组内无有效数值:如果df2的这两列存在非数字的字符串内容,
mean()无法完成计算,会直接排除该列。
针对性解决办法
1. 检查并修正数据类型
先对比两表的列类型,定位问题:
print("df1 列类型:\n", df1.dtypes) print("\ndf2 列类型:\n", df2.dtypes)
如果df2的L/400是object类型,转换为数值型:
import pandas as pd df2['L'] = pd.to_numeric(df2['L'], errors='coerce') df2['400'] = pd.to_numeric(df2['400'], errors='coerce')
errors='coerce'会把无法转换的内容转为NaN,后续可根据业务逻辑填充空值(比如用0、分组均值等)。
2. 排查并处理空值
检查空值分布:
print("df2 L列空值数:", df2['L'].isna().sum()) print("df2 400列空值数:", df2['400'].isna().sum())
如果是全空值,可填充默认值后再聚合:
df2['L'] = df2['L'].fillna(0) # 替换为符合业务逻辑的数值 df2['400'] = df2['400'].fillna(0)
3. 显式指定聚合列
如果确认列是数值型但仍被过滤,可强制指定所有需要聚合的列,避免自动筛选:
agg_cols = [col for col in df2.columns if col not in ["PlottedFind", "Assemblage"]] result_df2 = df2.groupby(["PlottedFind","Assemblage"], as_index=False).agg({col: 'mean' for col in agg_cols})
内容的提问来源于stack exchange,提问作者Ivan Anderies
相关产品推荐
相关产品推荐

