求助:DataFrame中姓名组合频次统计及Top10获取方法
解决姓名组合频次统计的问题
我来帮你梳理下问题所在,以及正确的解决方法~
首先,你当前代码的问题在于:df.groupby(['Name','Surname'])['Name'].count()会生成一个MultiIndex的Series(索引是(Name,Surname)组合,值是对应频次),而argmax()方法返回的是该Series中最大值的整数位置索引,不是你需要的(Name,Surname)组合本身,所以结果自然不符合预期。
下面是两种可靠的实现方案,你可以根据需求选择:
方案一:转换为DataFrame处理(更直观,适合后续扩展)
这种方式把分组结果转换成带列名的DataFrame,方便查看和操作:
# 1. 统计每个姓名组合的出现次数 name_counts_df = df.groupby(['Name', 'Surname']).size().reset_index(name='occurrences') # 2. 获取频次最高的组合及次数 most_freq_row = name_counts_df.loc[name_counts_df['occurrences'].idxmax()] top_name = f"{most_freq_row['Name']} {most_freq_row['Surname']}" top_count = most_freq_row['occurrences'] print(f"出现频次最高的姓名组合:{top_name},共出现 {top_count} 次") # 3. 获取Top10频次的组合列表 top10_combs = name_counts_df.sort_values(by='occurrences', ascending=False).head(10) # 可选:转换成元组列表格式 top10_list = list(top10_combs.itertuples(index=False, name=None)) print("\n频次Top10的姓名组合:") for name, surname, count in top10_list: print(f"{name} {surname}: {count} 次")
方案二:直接操作MultiIndex Series(更简洁)
如果不需要DataFrame格式,直接对分组后的Series操作更高效:
# 1. 统计每个姓名组合的出现次数 name_counts_series = df.groupby(['Name', 'Surname']).size() # 2. 获取频次最高的组合及次数 most_freq_comb = name_counts_series.idxmax() # 返回(Name, Surname)元组 most_freq_count = name_counts_series.max() print(f"出现频次最高的姓名组合:{most_freq_comb[0]} {most_freq_comb[1]},共出现 {most_freq_count} 次") # 3. 获取Top10频次的组合列表 top10_series = name_counts_series.sort_values(ascending=False).head(10) # 可选:转换成字典格式(键为姓名组合元组,值为次数) top10_dict = top10_series.to_dict() print("\n频次Top10的姓名组合:") for (name, surname), count in top10_dict.items(): print(f"{name} {surname}: {count} 次")
关键知识点说明:
- 用
groupby(...).size()替代count():两者都能统计分组行数,但size()更直接(统计所有行,包括缺失值),count()只统计非缺失值的列数,这里用size()更合适。 idxmax()vsargmax():idxmax()返回的是最大值对应的索引标签(这里就是(Name,Surname)组合),而argmax()返回的是最大值的整数位置,这是你之前出错的核心原因。
内容的提问来源于stack exchange,提问作者Nebojsa V NLPTrader
相关产品推荐
相关产品推荐

