如何在Pandas中无循环转换DataFrame格式以基于name关联其他表?
Pandas DataFrame 格式转换问题
问题描述
原始DataFrame结构:
id name value1 value2 value3 Type ======================================================= 1 AAA 1.0 1.5 1.8 NEW 2 BBB 2.0 2.3 2.5 NEW 3 CCC 3.0 3.6 3.7 NEW
希望转换为以下格式,以便通过唯一的name字段关联另一个DataFrame:
Type AAA BBB CCC ============================================================ NEW [1.0, 1.5, 1.8] [2.0, 2.3, 2.5] [3.0, 3.6, 3.7]
询问是否有无需过多循环的实现方法。
实现方法
完全可以用Pandas内置方法实现,不需要手动写循环,步骤如下:
- 合并value列为列表
把value1、value2、value3按行合并成列表列,用apply配合list即可:
df['values'] = df[['value1', 'value2', 'value3']].apply(list, axis=1)
- 重塑数据结构
用pivot方法将name转成列名,Type作为行索引,values作为对应值:
result = df.pivot(index='Type', columns='name', values='values').reset_index()
- 清理列名层级
默认pivot后会保留列名层级,可通过以下代码去掉:
result.columns.name = None
完整代码示例
import pandas as pd # 构造示例数据 data = { 'id': [1, 2, 3], 'name': ['AAA', 'BBB', 'CCC'], 'value1': [1.0, 2.0, 3.0], 'value2': [1.5, 2.3, 3.6], 'value3': [1.8, 2.5, 3.7], 'Type': ['NEW', 'NEW', 'NEW'] } df = pd.DataFrame(data) # 合并value列为列表 df['values'] = df[['value1', 'value2', 'value3']].apply(list, axis=1) # 转换为目标格式 result = df.pivot(index='Type', columns='name', values='values').reset_index() result.columns.name = None print(result)
运行后即可得到你需要的格式,全程基于Pandas向量式操作,效率远高于循环实现。
内容的提问来源于stack exchange,提问作者SM079
相关产品推荐
相关产品推荐

