如何在Pandas DataFrame中按相似值分组并聚合公司名称
实现公司名称聚合的解决方案
你需要给数据表新增Aggregated Company列,把同一家公司的分支/后缀名称统一为一个主名称,下面是几种可行的实现方式:
方法1:正则表达式提取主名称
针对你当前数据的规律——主名称后要么跟括号包裹的地区,要么跟额外后缀,用正则可以快速提取主名称。以Python pandas为例:
import pandas as pd import re # 构造原始数据 data = { 'Company': ['Company ABC (Singapore)', 'Company ABC (Japan)', 'Company ABC (New York)', 'Company D', 'Company D (United Kingdom)', 'Company D Pte Limited'], 'Cost': [1, 3, 4, 6, 5, 3] } df = pd.DataFrame(data) # 定义提取主名称的函数 def get_main_company(name): # 匹配括号前的主名称 bracket_match = re.match(r'(.+?)\s*\(', name) if bracket_match: return bracket_match.group(1) # 匹配带后缀的Company D变体 suffix_match = re.match(r'(Company D)\s.*', name) if suffix_match: return suffix_match.group(1) # 无匹配则返回原名称 return name # 生成聚合列 df['Aggregated Company'] = df['Company'].apply(get_main_company) print(df)
这段代码会直接生成你需要的目标数据表,正则规则可以根据实际的公司名称变体灵活调整。
方法2:自定义映射字典
如果公司名称的变体规则复杂,正则不好覆盖,直接定义映射字典是最稳妥的方式:
import pandas as pd data = { 'Company': ['Company ABC (Singapore)', 'Company ABC (Japan)', 'Company ABC (New York)', 'Company D', 'Company D (United Kingdom)', 'Company D Pte Limited'], 'Cost': [1, 3, 4, 6, 5, 3] } df = pd.DataFrame(data) # 定义所有变体到主名称的映射 company_map = { 'Company ABC (Singapore)': 'Company ABC', 'Company ABC (Japan)': 'Company ABC', 'Company ABC (New York)': 'Company ABC', 'Company D': 'Company D', 'Company D (United Kingdom)': 'Company D', 'Company D Pte Limited': 'Company D' } # 生成聚合列 df['Aggregated Company'] = df['Company'].map(company_map) print(df)
这种方式适合名称变体数量不多的场景,手动维护映射能保证100%的准确率。
关于groupby的正确使用
你之前用groupby没成功,问题应该是没先生成Aggregated Company列。有了这个列之后,就可以正常按聚合后的公司名分组统计了,比如计算各公司的总成本:
total_cost = df.groupby('Aggregated Company')['Cost'].sum().reset_index() print(total_cost)
输出结果:
| Aggregated Company | Cost |
|---|---|
| Company ABC | 8 |
| Company D | 14 |
内容的提问来源于stack exchange,提问作者nic
相关产品推荐
相关产品推荐

