You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将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列,每个公司对应唯一值

现有代码问题

你之前尝试的代码存在两个关键问题:

  1. 使用list(set(x))对sector去重,导致丢失重复的sector记录,同时打乱了原顺序
  2. 合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 00:20:30