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

Python:如何为聚类分析准备投票结果数据——转换与groupby操作

数据预处理与格式转换方案(用于投票模式聚类)

1. 长表转宽表(核心需求实现)

你需要的是将长格式数据转换为宽格式,每个地区(Place)作为一行,每个投票项(Vote)作为列,对应的值为该地区在该投票中的支持率(% yes)。这一步用pivot或pivot_table即可实现,而非groupby(groupby用于分组聚合,不负责结构重塑):

基础转换(无重复数据)

如果每个Place+Vote组合唯一,直接用pivot:

df_pivoted = df.pivot(index='Place', columns='Vote', values='% yes')

处理重复数据

如果存在同一个地区在同一项投票中有多条记录,用pivot_table指定聚合方式(比如取均值):

df_pivoted = df.pivot_table(
    index='Place',
    columns='Vote',
    values='% yes',
    aggfunc='mean'  # 可替换为'median'/'sum'等
)

缺失值处理

转换后会出现缺失值(比如Place Z只有Vote 208的数据),聚类算法需要完整的数值特征,需填充缺失值:

  • 用全局均值填充:
    df_pivoted.fillna(df_pivoted.mean(), inplace=True)
    
  • 用0填充(适用于未参与投票的场景):
    df_pivoted.fillna(0, inplace=True)
    
  • 用该地区的均值填充:
    df_pivoted.fillna(df_pivoted.mean(axis=1), inplace=True)
    

2. 聚类前的标准化处理

投票百分比的范围虽为0-100,但部分聚类算法(如K-Means)对特征尺度敏感,需做标准化/归一化:

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
scaled_data = scaler.fit_transform(df_pivoted)
# 转换回DataFrame方便查看
scaled_df = pd.DataFrame(scaled_data, index=df_pivoted.index, columns=df_pivoted.columns)

完整流程示例

import pandas as pd
from sklearn.preprocessing import StandardScaler

# 导入CSV数据
df = pd.read_csv('your_vote_data.csv')

# 转换为宽格式
df_pivoted = df.pivot(index='Place', columns='Vote', values='% yes')

# 填充缺失值
df_pivoted.fillna(df_pivoted.mean(), inplace=True)

# 标准化特征
scaler = StandardScaler()
scaled_df = pd.DataFrame(scaler.fit_transform(df_pivoted), 
                         index=df_pivoted.index, 
                         columns=df_pivoted.columns)

# 此时scaled_df可直接用于K-Means、层次聚类等分析

内容的提问来源于stack exchange,提问作者Raph

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 15:01:00