我需要将以下数据从长格式转换为宽格式。问题是该组的名称可能重复。另外,重复条目的数量是未知的,所以我也要考虑这一点。
这是期望的结果:
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'])
答案 0 :(得分:0)
这是一个常见问题,您需要使用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