如何将DataFrame从长格式转宽格式且保留重复值?
长格式DataFrame转带多sector列表的宽格式解决方案
原始数据
import pandas as pd df = pd.DataFrame({ 'company_name': ['do holdings co', 'real estate b.v.', 'real estate b.v.','real coiffure', 'real coiffure', 'elendom', 'theatre media ltd'], 'sector_1': ['Industrials', 'Finance', 'Finance','Consumer', 'Consumer','Real Estate', 'Media'], 'company_country': ['USA', 'Poland', 'Poland','USA','USA', 'Poland', 'Canada'], 'keyword': ['holding', 'real', 'estate','real','coiffure', 'elendom', 'theatre'], 'value': [1,1,1,1,1,1,1], 'sector': ['Finance', 'Real Estate', 'Real Estate', 'Real Estate', 'Consumer', 'Real Estate', 'Media'] })
需求说明
将上述长格式数据转换为宽格式,要求:
- 每个公司对应唯一一行记录
- 每个
keyword作为独立列,值为1(公司包含该关键词)或0(不包含) sector列保留该公司所有匹配的sector值(重复值需保留,如real estate b.v.需保留两个Real Estate)- 保留
sector_1和company_country列,每个公司对应唯一值
现有代码问题
你之前尝试的代码存在两个关键问题:
- 使用
list(set(x))对sector去重,导致丢失重复的sector记录,同时打乱了原顺序 - 合并
sector_1和company_country时未去重,会产生重复行
正确实现代码
import pandas as pd # 生成关键词宽表:每个关键词列标记1/0 df_keyword_wide = df.pivot_table( index='company_name', columns='keyword', values='value', aggfunc='sum', fill_value=0 ).reset_index() # 分组聚合sector:直接转为列表,保留所有原始值 df_sector = df.groupby('company_name')['sector'].apply(list).reset_index(name='sector') # 提取去重后的公司基础信息(sector_1、company_country) df_meta = df[['company_name', 'sector_1', 'company_country']].drop_duplicates().reset_index(drop=True) # 合并所有表 df_results = df_keyword_wide.merge(df_sector, on='company_name') \ .merge(df_meta, on='company_name') # 调整列顺序与预期一致 cols_order = ['company_name', 'sector_1', 'company_country', 'holding', 'real', 'estate', 'coiffure', 'elendom', 'theatre', 'sector'] df_results = df_results[cols_order] # 可选:将长度为1的sector列表转为字符串,和预期格式完全匹配 df_results['sector'] = df_results['sector'].apply(lambda x: x[0] if len(x) == 1 else x) print(df_results)
运行结果
company_name sector_1 company_country holding real estate coiffure elendom theatre sector 0 do holdings co Industrials USA 1 0 0 0 0 0 Finance 1 elendom Real Estate Poland 0 0 0 0 1 0 Real Estate 2 real coiffure Consumer USA 0 1 0 1 0 0 [Real Estate, Consumer] 3 real estate b.v. Finance Poland 0 1 1 0 0 0 [Real Estate, Real Estate] 4 theatre media ltd Media Canada 0 0 0 0 0 1 Media
内容的提问来源于stack exchange,提问作者Kas
相关产品推荐
相关产品推荐

