这叫什么:融化?透视?重塑?

时间:2017-06-12 20:18:15

标签: python pandas

这是一个关于在Python中使用pandas和ggplot的问题,但R答案也非常受欢迎。

我试图绘制一些时间序列数据,看起来有点像下面显示的那样。 X,Y,Z是孔板ID(实验名称),0,1,2是不同的时间。我希望能够将时间过程绘制为不同窗格/子图/面中的线图,并且在相同的面上,但使用不同的颜色。

   X    Y    Z
0  0.1  0.2  0.3
1  1.1  1.2  1.3
2  2.1  2.2  2.3

我知道大熊猫和ggplot一起让我说

from ggplot import *
ggplot(aes(x='T', y='value', color='well'), data = df) + geom_line()

from ggplot import *
ggplot(aes(x='T', y='value'), data = df) + geom_line() + facet_grid(x='well')

如果df看起来像这样

well  T   value
X     0   0.1
X     1   1.1
X     2   2.1
Y     0   0.2
Y     1   1.2
Y     2   2.2
Z     0   0.3
Z     1   1.3
Z     2   2.3  

,行不一定按顺序排列。

我的问题是,如何将上面的数据框放到代码下面的数据框中,这个操作叫做什么?同样,我主要对Python中的pandas和ggplot感兴趣,但是关于如何在R中完成此操作的答案也会非常有用。

如果有人可以推荐一个好的资源来学习用数据做这些事情,我也会感激。

2 个答案:

答案 0 :(得分:4)

它被称为使用pivot或fusion等方法重塑数据框,可以包括stack和unstack,pivot_table以及其他各种方法。

来自广泛的'到了'长'

print(df)

     X    Y    Z
0  0.1  0.2  0.3
1  1.1  1.2  1.3
2  2.1  2.2  2.3

您可以使用stackreset_index等方法重塑为长数据框:

df2 = df.stack().reset_index()
df2.columns = ['T','well','value']
print(df2)

   T well  value
0  0    X    0.1
1  0    Y    0.2
2  0    Z    0.3
3  1    X    1.1
4  1    Y    1.2
5  1    Z    1.3
6  2    X    2.1
7  2    Y    2.2
8  2    Z    2.3

或使用melt

df.reset_index().rename(columns={'index':'T'}).melt(id_vars='T').sort_values(by='T')

   T well  value
0  0    X    0.1
3  0    Y    0.2
6  0    Z    0.3
1  1    X    1.1
4  1    Y    1.2
7  1    Z    1.3
2  2    X    2.1
5  2    Y    2.2
8  2    Z    2.3

来自长期'广泛'

print(df2)

T well  value
0  0    X    0.1
3  0    Y    0.2
6  0    Z    0.3
1  1    X    1.1
4  1    Y    1.2
7  1    Z    1.3
2  2    X    2.1
5  2    Y    2.2
8  2    Z    2.3

使用pivot

df2.pivot(index='T',columns='well')

     value          
well     X    Y    Z
T                   
0      0.1  0.2  0.3
1      1.1  1.2  1.3
2      2.1  2.2  2.3

使用set_indexunstack

df2.set_index(['T','well']).unstack()

     value          
well     X    Y    Z
T                   
0      0.1  0.2  0.3
1      1.1  1.2  1.3
2      2.1  2.2  2.3

使用pivot_table

pd.pivot_table(df2,aggfunc='mean',index='T',columns='well')

     value          
well     X    Y    Z
T                   
0      0.1  0.2  0.3
1      1.1  1.2  1.3
2      2.1  2.2  2.3

答案 1 :(得分:1)

试试这个

df1 = df.T.stack().reset_index().rename(columns = {'level_0': 'well', 'level_1': 'T', 0: 'value'})


    well    T   value
0   X       0   0.1
1   X       1   1.1
2   X       2   2.1
3   Y       0   0.2
4   Y       1   1.2
5   Y       2   2.2
6   Z       0   0.3
7   Z       1   1.3
8   Z       2   2.3