我有一个pandas数据框,我需要重塑/转动。如何做到这一点似乎超越了我。数据框如下所示:
Ref Statistic Val1 Val2 Val3 Val4
0 Mean 0 1 2 3
0 Std 0.1 0.1 0.1 0.1
1 Mean 0 1 2 3
1 Std 0.1 0.1 0.1 0.1
2 Mean 0 1 2 3
2 Std 0.1 0.1 0.1 0.1
我的目标是达到这个目标:
Ref Values Mean Std
0 Val1 0 0.1
0 Val2 1 0.1
0 Val3 2 0.1
0 Val4 3 0.1
1 Val1 0 0.1
1 Val2 1 0.1
1 Val3 2 0.1
1 Val4 3 0.1
2 Val1 0 0.1
2 Val2 1 0.1
2 Val3 2 0.1
2 Val4 3 0.1
看起来这需要多个枢轴或者枢轴和groupby的组合,但我没有运气......
有什么想法吗?
答案 0 :(得分:5)
>>> df1 = pd.melt(df, value_vars=['Val1', 'Val2', 'Val3', 'Val4'],
... id_vars=['Statistic', 'Ref'], var_name='Values')
>>> df1.pivot_table(values='value', rows=['Ref', 'Values'], cols='Statistic')
Statistic Mean Std
Ref Values
0 Val1 0 0.1
Val2 1 0.1
Val3 2 0.1
Val4 3 0.1
1 Val1 0 0.1
Val2 1 0.1
Val3 2 0.1
Val4 3 0.1
2 Val1 0 0.1
Val2 1 0.1
Val3 2 0.1
Val4 3 0.1
[12 rows x 2 columns]
如果您不想拥有上述MultiIndex
,则可以在最后一个数据框中使用.reset_index
方法;
答案 1 :(得分:2)
作为melt
的替代方案,您可以设置MultiIndex并链接stack
和unstack
命令:
import pandas
# from io import StringIO # python 3
from StringIO import StringIO # python 2
datastring = StringIO('''\
Ref Statistic Val1 Val2 Val3 Val4
0 Mean 0 1 2 3
0 Std 0.1 0.1 0.1 0.1
1 Mean 0 1 2 3
1 Std 0.1 0.1 0.1 0.1
2 Mean 0 1 2 3
2 Std 0.1 0.1 0.1 0.1
''')
df = pandas.read_table(datastring, sep='\s\s+', index_col=['Ref', 'Statistic'])
df.columns.names = ['Values']
df.stack(level='values').unstack(level='Statistic')
Statistic Mean Std
Ref Values
0 Val1 0 0.1
Val2 1 0.1
Val3 2 0.1
Val4 3 0.1
1 Val1 0 0.1
Val2 1 0.1
Val3 2 0.1
Val4 3 0.1
2 Val1 0 0.1
Val2 1 0.1
Val3 2 0.1
Val4 3 0.1