首页 > 解决方案 > 熊猫:从长到宽投射/旋转多列?

问题描述

我正在尝试根据多列将我的数据从长到宽重新配置。我通常熟悉 cast 函数(来自 R)和 pivot 函数,但两者都没有让我得到想要的结果。

请参见下文 - 当前表是我目前拥有的:

d = {'Name': ['Tom','Tom','Tom','Tom','Tom','Tom','Jerry','Jerry','Jerry','Jerry'], 'col2': ['A','B','A','B','A','B','A','B','A','B'],
     'Result':[10,5,9,2,0,1,10,2,4,5],'Change:':[8,8,4,4,3,3,0,0,8,8]}
df = pd.DataFrame(data=d)

然后图中的中间表是我想要的宽数据,我按名称和日期分组然后将结果列设为值。对于每个 Name-Date,只有一个 Change 结果——所以我唯一需要加宽的列是 Type。

最后一步是计算类型 A 和 B 的每个 Name-Date 的 r^2 值。即输出表。

我尝试使用下面的cast 函数以及 pivot 函数。任何帮助将非常感激!

zz_cast=cast(df,'Type','Result(%)')
zz_pivot=df.pivot(index='Date',columns='Type', values='Result (%)')

在此处输入图像描述

标签: pythonpandas

解决方案


这是我为创建中间表(宽数据)所做的:

import numpy as np
import pandas as pd

d = {'Name': ['Tom','Tom','Tom','Tom','Tom','Tom','Jerry','Jerry','Jerry','Jerry'], 
 'Date': ['2018/07/31','2018/07/31','2018/04/30','2018/04/30','2018/01/31','2018/01/31','2018/10/31','2018/10/31','2018/07/31','2018/07/31'], 
 'Type': ['A','B','A','B','A','B','A','B','A','B'],
 'Result':[10,5,9,2,0,1,10,2,4,5],'Change:':[8,8,4,4,3,3,0,0,8,8]}
df = pd.DataFrame(data=d)

df.set_index(['Name','Date','Type']).unstack().reset_index()

推荐阅读