python-3.x - 具有重复组名的长到宽转换
问题描述
我需要将以下数据从长格式转换为宽格式。问题是该组的名称可能重复。此外,重复条目的数量是未知的,所以我也需要考虑这一点。
这是期望的结果:
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
. 然后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
推荐阅读
- java - 如何在另一个类中移动 @Override 方法
- flutter - 动态列表视图中的偏移文本字段文本
- c - 当我打印动态分配的数组时,它只打印最后一个值
- json - 根据 Flutter 中的选项组和选项计算产品变体
- assembly - 我想将 0x0000369c 数据存储到 0x000010fc 内存地址中。这个对吗?
- image-processing - 跨浏览器的图像解压一致性如何?
- node.js - 在这方面需要帮助:如何从 2021 年开始为 Dialogflow 上要在 Index.js 中使用的任何基本版本聊天机器人生成服务帐户密钥
- python - 命令引发异常:AttributeError: 'Guild' object has no attribute 'voice' 错误
- javascript - How to Restart fetch api request after aborting using AbortController
- node.js - Express、NodeMailer、React:发送带有表单值的电子邮件