具有重复组名称的长到宽转换[重复]

2024-03-09

我需要将以下数据从长格式转换为宽格式。问题是该组的名称可能重复。另外,重复条目的数量未知,因此我也需要考虑到这一点。

这是期望的结果:

desired_data = [[1,'Joe Tell','111-222-3333','Al Mead','222-333-4444','Ted Shaw','444-344-2323'],       
        [2,'Don Roads','555-222-5213','','','Ted Frank','222-444-2323']]


df_result = pd.DataFrame(desired_data, columns = ['ID', 'Primary 1 - Name','Primary 1 - Phone',
                                                  'Primary 2 - Name','Primary 2 - Phone',
                                                  'Secondary 1 - Name','Secondary 1 - Phone'])

我尝试过旋转数据,但在重复组问题上出错。我尝试手动向“序列”名称添加前缀,但它变得混乱。

data = [[1,'Joe Tell','Primary','111-222-3333'], 
        [1,'Al Mead','Primary','222-333-4444'], 
        [1,'Ted Shaw','Secondary','444-344-2323'],
        [2,'Don Roads','Primary','555-222-5213'],
        [2,'Ted Frank','Secondary','222-444-2323']]

df = pd.DataFrame(data, columns = ['ID', 'Name','Sequence','Phone']) 


df.pivot(index='ID', columns='Sequence', values=['Name','Phone'])

这是一个常见问题,您需要为列创建另一个索引级别cumcount. Then pivot_table并使用first用于聚合。我们可以折叠 MultiIndex 列。

df['idx'] = df.groupby(['ID', 'Sequence']).cumcount()+1

res = (df.pivot_table(index='ID', columns=['Sequence', 'idx'], values=['Name', 'Phone'],
                      aggfunc='first')
         .sort_index(level=[1, 2], axis=1))

res.columns = [f'{seq} {num} - {item}' for item,seq,num in res.columns]

   Primary 1 - Name Primary 1 - Phone Primary 2 - Name Primary 2 - Phone Secondary 1 - Name Secondary 1 - Phone
ID                                                                                                             
1          Joe Tell      111-222-3333          Al Mead      222-333-4444           Ted Shaw        444-344-2323
2         Don Roads      555-222-5213              NaN               NaN          Ted Frank        222-444-2323
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

具有重复组名称的长到宽转换[重复] 的相关文章

随机推荐