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
相关产品推荐
相关产品推荐

