如何对DataFrameGroupBy对象的数值列标准化?需移除含字符串列
解决方案
要实现按文本列分组后仅标准化数值列,核心是只对分组后的数值列应用标准化逻辑,避免字符串列传入Scaler。以下是两种可行方法:
方法1:使用groupby.apply处理分组
先提取数值列,再定义分组处理函数,对每个分组的数值列单独标准化:
import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.DataFrame({ "cost": [30,15,100,65,75,55,29,45], "sales":[80,88,70,80,999,70,8,95], "da_value":["low","low","high","medium","high","medium","low","medium"], "names": ["Jo","Andrew","AI","Michael","Nikola","Jim","Bojan","Vurce"] }) # 提取所有数值列 num_cols = df.select_dtypes(include=['int64', 'float64']).columns def scale_group_numeric(group): scaler = StandardScaler() # 仅对数值列做标准化,覆盖原列值 group[num_cols] = scaler.fit_transform(group[num_cols]) return group # 分组后应用处理函数 df_scaled = df.groupby('da_value').apply(scale_group_numeric) print(df_scaled)
方法2:使用groupby.transform更高效处理
transform可以直接返回与原DataFrame索引对齐的结果,无需完整返回分组,代码更简洁:
import pandas as pd from sklearn.preprocessing import StandardScaler df = pd.DataFrame({ "cost": [30,15,100,65,75,55,29,45], "sales":[80,88,70,80,999,70,8,95], "da_value":["low","low","high","medium","high","medium","low","medium"], "names": ["Jo","Andrew","AI","Michael","Nikola","Jim","Bojan","Vurce"] }) num_cols = df.select_dtypes(include=['int64', 'float64']).columns scaler = StandardScaler() # 对每个分组的数值列应用标准化,直接替换原数值列 df[num_cols] = df.groupby('da_value')[num_cols].transform( lambda x: scaler.fit_transform(x.values.reshape(-1,1)).flatten() ) print(df)
错误原因说明
之前报错是因为直接将包含字符串列的整个分组DataFrame传入scaler.fit_transform,而StandardScaler仅支持数值类型数据,无法处理字符串,因此抛出ValueError。上述两种方法都确保了仅数值列被传入Scaler,同时保留原DataFrame的所有列结构。
内容的提问来源于stack exchange,提问作者user3430128
相关产品推荐
相关产品推荐

