Python 将数据帧从宽旋转到长

Python 将数据帧从宽旋转到长,python,pandas,dataframe,Python,Pandas,Dataframe,我不确定这些数据的格式是否正确,但我想做的是: 从d1形状转换为d2 [26]中的:d1=pd.DataFrame({'where':['x','y'], …:'p1':[3,7], …:'p2':[11,12]}) 在[27]中:d2=pd.DataFrame({ …:'where':['x','x','y','y'], …:‘谁’:[‘p1’、‘p2’、‘p1’、‘p2’], …:“值”:[3,11,7,12]}) 看起来是: [10]中的:d1 出[10]: 其中p1p2 0 x 3 1

我不确定这些数据的格式是否正确,但我想做的是:

d1
形状转换为
d2

[26]中的
:d1=pd.DataFrame({'where':['x','y'],
…:'p1':[3,7],
…:'p2':[11,12]})
在[27]中:d2=pd.DataFrame({
…:'where':['x','x','y','y'],
…:‘谁’:[‘p1’、‘p2’、‘p1’、‘p2’],
…:“值”:[3,11,7,12]})
看起来是:

[10]中的
:d1
出[10]:
其中p1p2
0 x 3 11
1 y 7 12
在[11]中:d2
出[11]:
谁看重什么
0 x p1 3
1 x p2 11
2 y p1 7
3 y p2 12
我认为这是d1.pivot(…)的某种形式,但我似乎不知道该怎么做

因此,为了清楚起见,我希望能够使用pandas将数据
d1
重塑为
d2
的结构

编辑 下面的方法可行,但效果很差

d3=d1.pivot(columns='where').T.reset_index()
d3.columns=['who','where','a','b']
d3=d3.loc[:,['where','who','a','b']
d3=d3.排序_值('其中')
d3.fillna(值=0,就地=True)
d3['c']=d3.a+d3.b
d3.下降(['a','b',轴=1,原地=True)
d3.列=['where','who','value']
In[43]:d3
出[43]:
谁看重什么
0 x p1 3.0
2xp211.0
1 y p1 7.0
3 y p2 12.0
编辑2 以下作品

[49]中的
:d1.melt(id\u vars='where')
出[49]:
其中变量值
0 x p1 3
1 y p1 7
2 x p2 11
3 y p2 12
我很好奇pivot是否能做到这一点?我的印象是,所有这些操作都可以使用pivot函数完成

编辑3-恢复原始结构的示例 上面我指的是
pivot
函数,而不是
pivot\u表
函数,尽管下面的示例是一种查找给定最终结果的原始结构的方法

d1.melt(id_vars='where').pivot_表(values=“value”、index=“where”、columns=“variable”)
变量p1p2
哪里
x 3 11
y 7 12

不,这不能用透视表完成。您不能在数据帧内旋转值

您可以使用pivot将d2返回到d1。下面的示例显示d1变成d2(按照最初的请求),然后我们可以使用pivot_表将d2返回给d1

d1.melt(id_vars='where')

  where variable  value
0     x       p1      3
1     y       p1      7
2     x       p2     11
3     y       p2     12


d1.melt(id_vars='where').pivot(values="value", index="where", columns="variable")

variable    p1  p2
where       
x           3   11
y           7   12
您试图做的是将数据从一个宽数据集“unpivot”到一个长数据集


这应该可以做到:

d1.set_index('where').unstack().reset_index().rename(列={“level_0”:“who”,0:“value”})
输出:

who who where value
0 p1 x 3
1 p1 y 7
2p2x11
3 p2 y 12

pivot---melt或stack@YOBEN_S如前所述,我知道这一功能,我要求提供使用指南it@YOBEN_S我已经编辑了OP“不能用透视表完成”-熊猫
pivot
pivot\u table
是完全不同的东西,不是吗?我指的不是使用pivot表,pivot和pivot_表是一样的,唯一的区别是pivot_表也有聚合函数(它更多的是针对数字数据),而pivot()提供了各种数据类型(字符串、数字等)的通用数据透视,pandas还提供了pivot_table(),用于聚合数值数据进行数据透视。所以我很困惑,它们是相同的还是不同的?就功能而言,哪一个是另一个的子集?它们是相同的,pivot_表是pivot的演变,它包含额外的功能。