基于含多标签的Pandas DataFrame创建分组/堆叠条形图
解决Pandas多标签列的条形图绘制问题
我来帮你搞定这个多标签列的条形图绘制需求!首先咱们先把你的示例数据整理好,然后一步步拆分标签、统计频次,最后画出清晰的条形图。
第一步:准备示例数据和导入库
首先先把你的DataFrame用代码还原,同时导入需要的库:
import pandas as pd from matplotlib import pyplot as plt # 构建你的示例DataFrame data = { 'Name': ['foo', 'bar', 'bla', 'blu', 'boo', 'faa'], 'Cat_1': ['P', 'R, M', 'E', 'F', 'G', 'P, E'], 'Cat_2': ['Apples, Pears, Cats', 'Apples', 'Pears', 'Cats, Pears', 'Apples, Pears', 'Apples, Cats'] } df = pd.DataFrame(data)
第二步:拆分多标签列
因为Cat_1和Cat_2里的标签是用逗号分隔的,我们需要把每个标签拆分成单独的行,这样才能统计每个标签的出现次数。用str.split()拆分字符串,再用explode()把列表展开成多行:
# 处理Cat_1列:拆分并展开 cat1_expanded = df['Cat_1'].str.split(', ', expand=True).stack().reset_index(level=1, drop=True).rename('Cat_1') # 处理Cat_2列:拆分并展开 cat2_expanded = df['Cat_2'].str.split(', ', expand=True).stack().reset_index(level=1, drop=True).rename('Cat_2') # 统计每个标签的出现频次 cat1_counts = cat1_expanded.value_counts().sort_index() cat2_counts = cat2_expanded.value_counts().sort_index()
第三步:绘制条形图
现在我们可以把两个列的标签频次分别绘制,或者放在同一个图里对比。这里用子图来展示两个列的条形图,更清晰:
# 创建子图,1行2列 fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5)) # 绘制Cat_1的条形图 cat1_counts.plot(kind='bar', ax=ax1, color='#1f77b4') ax1.set_title('Cat_1标签频次') ax1.set_xlabel('标签') ax1.set_ylabel('出现次数') # 绘制Cat_2的条形图 cat2_counts.plot(kind='bar', ax=ax2, color='#ff7f0e') ax2.set_title('Cat_2标签频次') ax2.set_xlabel('标签') ax2.set_ylabel('出现次数') # 调整布局,避免标签重叠 plt.tight_layout() plt.show()
额外优化:合并对比的条形图
如果你想把两个列的标签放在同一个图里对比,可以先把两个统计结果合并成一个DataFrame,再绘制:
# 合并两个统计结果 combined_counts = pd.DataFrame({ 'Cat_1': cat1_counts, 'Cat_2': cat2_counts }).fillna(0) # 把不存在的标签次数设为0 # 绘制堆叠或分组条形图 combined_counts.plot(kind='bar', figsize=(10, 6), rot=0) plt.title('Cat_1 vs Cat_2 标签频次对比') plt.xlabel('标签') plt.ylabel('出现次数') plt.legend(title='类别') plt.show()
这样处理后,就能清晰展示每个标签在对应列中的出现次数啦!
内容的提问来源于stack exchange,提问作者Fourier
相关产品推荐
相关产品推荐

