bax*_*axx 6 python dataframe pandas
我不确定这些数据是否正确采用宽格式,但我想做的是以下内容:
从 形状 转换d1为 形状d2
In [26]: d1 = pd.DataFrame({'where':['x','y'],
...: 'p1':[3,7],
...: 'p2':[11,12]})
In [27]: d2=pd.DataFrame({
...: 'where':['x','x','y','y'],
...: 'who':['p1','p2','p1','p2'],
...: 'value':[3,11,7,12]})
Run Code Online (Sandbox Code Playgroud)
看起来像:
In [10]: d1
Out[10]:
where p1 p2
0 x 3 11
1 y 7 12
In [11]: d2
Out[11]:
where who value
0 x p1 3
1 x p2 11
2 y p1 7
3 y p2 12
Run Code Online (Sandbox Code Playgroud)
我认为这是某种形式d1.pivot( ... ),但我似乎不知道如何去做。
因此,需要明确的是,我希望能够将数据重塑d1为使用 pandas 的结构d2。
以下方法有效,但这是一个很糟糕的方法
d3 = d1.pivot(columns='where').T.reset_index()
d3.columns = ['who','where','a','b']
d3 = d3.loc[:,['where','who','a','b']]
d3 = d3.sort_values('where')
d3.fillna(value=0,inplace=True)
d3['c'] = d3.a + d3.b
d3.drop(['a','b'],axis=1,inplace=True)
d3.columns=['where','who','value']
In [43]: d3
Out[43]:
where who value
0 x p1 3.0
2 x p2 11.0
1 y p1 7.0
3 y p2 12.0
Run Code Online (Sandbox Code Playgroud)
以下作品
In [49]: d1.melt(id_vars='where')
Out[49]:
where variable value
0 x p1 3
1 y p1 7
2 x p2 11
3 y p2 12
Run Code Online (Sandbox Code Playgroud)
我很好奇枢轴是否可以实现这一点?我的印象是所有这些操作都可以使用pivot函数来完成
上面我指的是pivot函数,而不是pivot_table函数,尽管下面的示例是在给定最终值的情况下查找原始结构的一种方法
d1.melt(id_vars='where').pivot_table(values="value", index="where", columns="variable")
variable p1 p2
where
x 3 11
y 7 12
Run Code Online (Sandbox Code Playgroud)
不,这不能用数据透视表来完成。您没有在数据框中旋转值。
\n\n您可以使用pivot 将 d2 返回到 d1。例如,下面显示 d1 变成 d2(按照最初的要求),然后我们可以使用pivot_table 将 d2 返回到 d1。
\n\nd1.melt(id_vars=\'where\')\n\n where variable value\n0 x p1 3\n1 y p1 7\n2 x p2 11\n3 y p2 12\n\n\nd1.melt(id_vars=\'where\').pivot(values="value", index="where", columns="variable")\n\nvariable p1 p2\nwhere \nx 3 11\ny 7 12\nRun Code Online (Sandbox Code Playgroud)\n\n您想要做的是将数据从宽数据集“逆透视”到长数据集
\n\n\n| 归档时间: |
|
| 查看次数: |
3229 次 |
| 最近记录: |