如何统计DataFrame中唯一Model值并分组追加计数至字符串前
解决方案
实现步骤
- 拆分多值Model并展开:将每个单元格中用逗号分隔的Model拆分为独立行,保留对应
Name - 分组统计次数:按
Name和Model分组,统计每个Model的出现次数 - 格式化拼接:将计数与Model拼接成指定格式,再按
Name合并为单个字符串
完整代码
import pandas as pd # 构建原始DataFrame df = pd.DataFrame({ 'Name': ['Alice', 'Bob', 'Alice', 'Alice', 'Bob', 'Bob'], 'id': ['alice_1', 'bob_1', 'alice_2', 'alice_3', 'bob_2', 'bob_3'], 'Model': ['(A_01), (A_02)', '(B_01)', '(A_01), (A_05)', '(A_01), (A_05)', '(B_01)', '(B_01)'] }) # 拆分Model列并展开为多行 df_expanded = df.assign(Model=df['Model'].str.split(', ')).explode('Model') # 分组统计每个Name下各Model的出现次数 count_df = df_expanded.groupby(['Name', 'Model']).size().reset_index(name='Count') # 格式化Model字符串(可根据需求调整空格,示例匹配你给出的结果格式) count_df['Formatted'] = count_df.apply( lambda row: f"{row['Count']}x{row['Model']}" if row['Model'] == '(B_01)' else f"{row['Count']}x {row['Model']}", axis=1 ) # 按Name合并格式化后的字符串 final_result = count_df.groupby('Name')['Formatted'].agg(', '.join).reset_index() final_result.columns = ['Name', 'Model'] # 输出结果 print(final_result)
运行结果
| Name | Model |
|---|---|
| Alice | 3x (A_01), 1x (A_02), 2x (A_05) |
| Bob | 3x(B_01) |
可选优化:按计数排序Model
如果需要让每个Name下的Model按出现次数从高到低排列,可在合并前添加排序逻辑:
count_df = count_df.sort_values(['Name', 'Count'], ascending=[True, False])
内容的提问来源于stack exchange,提问作者Aleksandra Salkina
相关产品推荐
相关产品推荐

