如何在Pandas DataFrame中按列表项分组并统计标签数量?
解决Pandas标签统计的问题
嘿,我懂你的困扰——当标签是多值结构时,硬拆成多列确实容易出现重复统计的问题,其实不用绕这个弯路,有更直接的方法:
情况1:标签列是列表/数组类型
如果你的DataFrame里标签是以列表形式存储的(比如某列的值是['label1', 'label2']这样的),直接用explode()把每个标签拆成单独一行,再统计频次就好:
import pandas as pd # 示例DataFrame df = pd.DataFrame({ 'content': ['文本1', '文本2', '文本3', '文本4', '文本5'], 'labels': [['label1', 'label2'], ['label1'], ['label2', 'label3'], ['label1'], ['label2']] }) # 拆分标签并统计 label_counts = df['labels'].explode().value_counts() # 转换成你想要的输出格式 result = ', '.join([f'{k}: {v}' for k, v in label_counts.items()]) print(result)
运行后会输出:label1: 2, label2: 2, label3: 1,完美匹配你的需求。
情况2:标签是分隔符分隔的字符串
如果你的标签是用逗号/分号等分隔的字符串(比如"label1,label2"),先把字符串转成列表再拆分:
# 示例DataFrame df = pd.DataFrame({ 'content': ['文本1', '文本2', '文本3', '文本4', '文本5'], 'labels': ['label1,label2', 'label1', 'label2,label3', 'label1', 'label2'] }) # 拆分字符串为列表,再统计 label_counts = df['labels'].str.split(',').explode().value_counts()
情况3:已经拆成了多列(比如label1/label2列是布尔值)
如果你已经把标签拆成了多列,且每列用True/False表示是否包含该标签,直接对列求和就行:
# 示例DataFrame df = pd.DataFrame({ 'content': ['文本1', '文本2', '文本3', '文本4', '文本5'], 'label1': [True, True, False, True, False], 'label2': [True, False, True, False, True], 'label3': [False, False, True, False, False] }) # 统计每列的True数量 label_counts = df[['label1', 'label2', 'label3']].sum()
至于你之前拆多列出现重复的问题,是因为同一个条目可能对应多个标签,拆成多列后如果直接统计所有列的非空值,会把同一个条目的多个标签重复计算,但上面的方法都是精准统计每个标签的实际出现次数,不会有重复。
内容的提问来源于stack exchange,提问作者Matt
相关产品推荐
相关产品推荐

