首页 > 解决方案 > 具有重复组名的长到宽转换

问题描述

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

这是期望的结果:

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'])

标签: python-3.xpandas

解决方案


这是一个常见问题,您需要为具有cumcount. 然后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

推荐阅读