Pandas作业难题:用crosstab生成Top10政党年度交叉表
解决Pandas生成Top10政党年度交叉表的问题
我来帮你搞定这个需求!核心思路其实很清晰:先找出全局提问量最高的10个政党,再基于这个子集生成交叉表——这比直接在交叉表上硬操作要靠谱得多。之前你尝试groupby、sort_values没成功,大概率是没先拿到全局Top10的政党列表,而是在分组后处理,方向偏了。
步骤1:获取提问量Top10的政党列表
首先我们需要统计每个政党的总提问次数(假设每一行代表一个提问),然后取前10个:
import pandas as pd # 统计每个政党的总提问次数,value_counts()会自动按降序排列 party_total_counts = df['Parties'].value_counts() # 提取Top10政党的名称(返回的是索引,转成列表方便后续过滤) top10_parties = party_total_counts.nlargest(10).index.tolist()
这里用value_counts()比groupby('Parties').size()更简洁,它直接返回按数量降序排列的结果,nlargest(10)快速取前10,再通过.index拿到对应的政党名称。
步骤2:生成Top10政党的年度交叉表
有两种高效的实现方式,你可以根据数据集大小选择:
方法一:先过滤原数据,再生成交叉表(适合大型数据集)
先把原数据中不属于Top10政党的行过滤掉,再做交叉表,能大幅减少计算量:
# 过滤出仅包含Top10政党的记录 df_top10 = df[df['Parties'].isin(top10_parties)] # 生成目标交叉表 crosstab_top10 = pd.crosstab(index=df_top10['Year'], columns=df_top10['Parties'])
为什么这个方法有效?:我们先缩小了数据集的范围,只保留需要的政党数据,后续crosstab只处理这些行,内存占用和计算速度都会更优,特别适合你的大型数据集。
方法二:先生成完整交叉表,再筛选列(更直观)
如果已经生成了完整的交叉表,直接筛选Top10政党的列即可:
# 先生成完整的年度-政党交叉表 full_crosstab = pd.crosstab(index=df['Year'], columns=df['Parties']) # 只保留Top10政党的列 crosstab_top10 = full_crosstab[top10_parties]
注意:这种方法适合数据集不算特别大的情况,否则生成完整交叉表会占用较多内存。
为什么之前的尝试没成功?
你提到用了groupby、sort_values、unique但没成功,大概率是因为:
- 用
groupby('Year', 'Parties')是按年度+政党分组,得到的是每个年度内各政党的提问量,无法直接得到全局的Top10政党; unique()只是获取所有不重复的政党名称,没有统计数量和排序筛选;- 没有先提取全局Top10的政党列表,就直接尝试生成交叉表,导致列还是包含所有政党。
额外注意事项
如果你的Parties列存在格式问题(比如大小写不一致、前后空格),建议先清洗数据,避免统计错误:
df['Parties'] = df['Parties'].str.strip().str.title()
内容的提问来源于stack exchange,提问作者Yoeril




