You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动