如何统计Pandas中列表列内各唯一值的出现次数
高效统计DataFrame列表列中元素的出现次数
嘿,刚好我之前也碰到过一样的需求,给你分享两个比嵌套循环高效得多的解决方案,轻松得到你想要的包含Genre和Occurrence列的结果:
方法一:用pandas的explode()(最直观)
explode()是pandas专门用来处理列表型列的神器,它能把每个列表里的元素拆成单独的行,之后再用value_counts()统计就精准了:
import pandas as pd # 模拟你的数据集 df = pd.DataFrame({ 'Genres': [['Action', 'Comedy'], ['Drama', 'Action'], ['Comedy', 'Romance'], ['Action']] }) # 核心步骤:炸开列表列 → 统计元素次数 → 重置索引并重命名列 result_df = df['Genres'].explode().value_counts().reset_index() result_df.columns = ['Genre', 'Occurrence'] print(result_df)
输出结果会是:
Genre Occurrence 0 Action 3 1 Comedy 2 2 Drama 1 3 Romance 1
这个方法完全是矢量化操作,没有手动循环,pandas内部做了优化,处理大数据集也超快。
方法二:用itertools.chain扁平化列表(内存友好)
如果你的数据集特别大,用itertools.chain来扁平化列表会更省内存,因为它是迭代器模式,不会一次性把所有元素加载到内存里:
from itertools import chain import pandas as pd df = pd.DataFrame({ 'Genres': [['Action', 'Comedy'], ['Drama', 'Action'], ['Comedy', 'Romance'], ['Action']] }) # 把所有列表元素拼成一个迭代器 all_genres = chain.from_iterable(df['Genres']) # 转成Series统计次数,再整理成目标DataFrame result_df = pd.Series(all_genres).value_counts().reset_index() result_df.columns = ['Genre', 'Occurrence'] print(result_df)
这个方法的输出和上面完全一样,但对于超大规模的数据集,内存占用会比explode()低一些,适合极端场景。
这两个方法都比嵌套循环高效太多,而且代码简洁易读,再也不用写繁琐的双层循环啦~
内容的提问来源于stack exchange,提问作者Eakan
相关产品推荐
相关产品推荐

