如何用Pandas将单列键值对转换为结构化DataFrame?
Pandas将键值对单列DataFrame转换为结构化表格
问题场景
现有仅包含KEY_VAL列的Pandas DataFrame,数据以固定的「键-值」对重复出现,每组包含Date、Location、Description、Voyage四个键及其对应值,行数随新增数据动态变化。
输入数据示例
import pandas as pd lis = ['Date', '01/07/2022', 'Location', 'Paris', 'Description', 'Empty', 'Voyage', 'EMPTY', 'Date', '28/06/2022', 'Location', 'Lyon', 'Description', 'Import', 'Voyage', 'LADEN', 'Date', '24/06/2022', 'Location', 'Marseille', 'Description', 'PORT', 'Voyage', 'BARGE'] df = pd.DataFrame(lis, columns=['KEY_VAL'])
原始DataFrame输出
KEY_VAL 0 Date 1 01/07/2022 2 Location 3 Paris 4 Description 5 Empty 6 Voyage 7 EMPTY 8 Date 9 28/06/2022 10 Location 11 Lyon 12 Description 13 Import 14 Voyage 15 LADEN 16 Date 17 24/06/2022 18 Location 19 Marseille 20 Description 21 PORT 22 Voyage 23 BARGE
目标结构化DataFrame
dic = {'Date' : ['01/07/2022', '28/06/2022', '24/06/2022'], 'Location' : ['Paris', 'Lyon', 'Marseille'], 'Description' : ['Empty', 'Import', 'PORT'], 'Voyage' : ['EMPTY', 'LADEN', 'BARGE'] } df2 = pd.DataFrame(dic)
输出效果:
Date Location Description Voyage 0 01/07/2022 Paris Empty EMPTY 1 28/06/2022 Lyon Import LADEN 2 24/06/2022 Marseille PORT BARGE
解决方案
方法一:简洁数组重塑法
利用数据的固定分组规律,直接将一维数据转为二维数组后提取对应内容:
# 将单列数据转为每行8个元素的二维数组(每组4个键+4个值) data = df['KEY_VAL'].values.reshape(-1, 8) # 提取每组的对应值作为行,第一组的键作为列名 result = pd.DataFrame(data[:, 1::2], columns=data[0, ::2])
reshape(-1, 8):自动计算分组数,将一维数组拆分为每行8个元素的二维结构data[:, 1::2]:提取所有组的值(每组的第2、4、6、8个元素)data[0, ::2]:提取第一组的键名作为新DataFrame的列名
方法二:分组透视法
适合需要更清晰步骤理解的场景:
# 1. 给每组数据添加分组ID(每8行一组) df['group_id'] = df.index // 8 # 2. 拆分键和值行 keys = df[df.index % 2 == 0].rename(columns={'KEY_VAL': 'key'}).reset_index(drop=True) values = df[df.index % 2 == 1].rename(columns={'KEY_VAL': 'value'}).reset_index(drop=True) # 3. 合并后透视成结构化表格 merged = pd.concat([keys, values], axis=1) result = merged.pivot(index='group_id', columns='key', values='value').reset_index(drop=True)
内容的提问来源于stack exchange,提问作者M-M
相关产品推荐
相关产品推荐

