You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何对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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 12:33:30