Pandas按索引合并并将行按值转换为新列的实现方案
Pandas长格式转宽格式:按语言生成列并保留原有数据
要实现你需要的长→宽格式转换,用Pandas的pivot(或pivot_table处理重复值场景)就能轻松搞定,步骤如下:
1. 先准备原始数据(模拟你的输入)
首先我们先把你给出的原始数据构造成DataFrame:
import pandas as pd # 模拟你的原始长格式数据 df = pd.DataFrame({ 'some_data': ['1 12', '1 12', '1 12', '2 52', '2 52', '2 52'], 'language': ['french', 'english', 'spanish', 'french', 'english', 'spanish'], 'spelling': ['un', 'one', 'uno', 'deux', 'two', 'dos'] })
2. 映射语言到目标列名
因为你需要把english转成lang_en、french转成lang_fr、spanish转成lang_sp,先做一个映射转换:
# 定义语言到目标列名的映射 lang_col_mapping = { 'english': 'lang_en', 'french': 'lang_fr', 'spanish': 'lang_sp' } # 新增一列存储转换后的列名 df['target_col'] = df['language'].map(lang_col_mapping)
3. 执行长转宽操作
用pivot方法,以some_data为索引,target_col为新列名,spelling为对应列的值:
# 转成宽格式 wide_df = df.pivot( index='some_data', # 要保留的分组列(不转成新列的部分) columns='target_col', # 要转成新列的字段 values='spelling' # 新列对应的值 ).reset_index() # 把索引转回普通列 # 调整列顺序,和你的目标格式一致 wide_df = wide_df[['some_data', 'lang_en', 'lang_fr', 'lang_sp']]
执行后得到的wide_df就是你要的目标格式:
some_data lang_en lang_fr lang_sp 0 1 12 one un uno 1 2 52 two deux dos
特殊情况处理:如果有重复的分组+语言组合
如果你的原始数据中,同一个some_data+language存在多条记录(即重复值),pivot会报错,这时候改用pivot_table并指定聚合函数(比如取第一个值、均值等):
wide_df = df.pivot_table( index='some_data', columns='target_col', values='spelling', aggfunc='first' # 取第一个出现的值,你也可以用'mean'/'sum'等 ).reset_index()
补充:如果some_data实际是多列
看你的目标格式里some_data是1 12这种复合值,如果实际是两列(比如col1=1、col2=12),只需要把index参数改成列名列表即可:
# 假设原始数据是两列 df = pd.DataFrame({ 'col1': [1,1,1,2,2,2], 'col2': [12,12,12,52,52,52], 'language': ['french', 'english', 'spanish', 'french', 'english', 'spanish'], 'spelling': ['un', 'one', 'uno', 'deux', 'two', 'dos'] }) wide_df = df.pivot( index=['col1', 'col2'], columns='target_col', values='spelling' ).reset_index()
这样得到的结果会保留col1和col2两列,和你的目标格式对应。
内容的提问来源于stack exchange,提问作者velxundussa
相关产品推荐
相关产品推荐

