多列Groupby后筛选Top N数据并绘制Seaborn图表
解决方案
步骤1:准备数据与导入库
先导入所需工具库,并构造示例数据集:
import pandas as pd import seaborn as sns import matplotlib.pyplot as plt # 构造示例数据集 data = { 'Data1': ['A','A','A','B','B','B','C','C','C','D','D','D','E','E','E','F','F','F'], 'Data2': ['x','y','z','y','z','u','x','y','v','v','y','z','t','u','x','s','s','r'], 'Value': [6,7,8,3,4,5,6,7,8,4,5,7,8,7,6,4,5,6] } df = pd.DataFrame(data)
步骤2:筛选Top3的Data1分组
方式1:按聚合指标取Top3(以Value总和为例)
如果你需要按每组的Value总和、最大值等指标筛选Top3,可执行以下代码:
# 计算每个Data1的Value总和,降序排序后取前3个Data1 top3_data1 = df.groupby('Data1')['Value'].sum().sort_values(ascending=False).head(3).index # 过滤原数据集,保留Top3的Data1记录 filtered_df = df[df['Data1'].isin(top3_data1)]
方式2:按Data1的顺序取前3(匹配示例期望结果)
如果只需保留Data1字母顺序的前3组(A、B、C),直接执行:
top3_data1 = df['Data1'].unique()[:3] filtered_df = df[df['Data1'].isin(top3_data1)]
步骤3:用Seaborn绘制图表
分组条形图(展示各Data1下不同Data2的Value)
plt.figure(figsize=(10,6)) sns.barplot(data=filtered_df, x='Data1', y='Value', hue='Data2') plt.title('Top3 Data1分组的Value分布') plt.show()
箱线图(展示Top3 Data1的Value分布特征)
plt.figure(figsize=(10,6)) sns.boxplot(data=filtered_df, x='Data1', y='Value') plt.title('Top3 Data1的Value分布箱线图') plt.show()
验证结果
按方式2执行后,filtered_df的结果与你期望一致:
| Data1 | Data2 | Value |
|---|---|---|
| A | x | 6 |
| A | y | 7 |
| A | z | 8 |
| B | y | 3 |
| B | z | 4 |
| B | u | 5 |
| C | x | 6 |
| C | y | 7 |
| C | v | 8 |
内容的提问来源于stack exchange,提问作者Vipin
相关产品推荐
相关产品推荐

