将pandas数据集列作为行的数据透视表的有效方法是什么?

时间:2014-12-23 17:08:19

标签: python pandas pivot-table

我们以下面的数据集为例:

    make    address all     3d   our    over    length_total    y
0   0.0     0.64    0.64    0.0  0.32   0.0     278             1
1   0.21    0.28    0.5     0.0  0.14   0.28    1028            1
2   0.06    0.0     0.71    0.0  1.23   0.19    2259            1
3   0.15    0.0     0.46    0.1  0.61   0.0     1257            1
4   0.06    0.12    0.77    0.0  0.19   0.32    749             1
5   0.0     0.0     0.0     0.0  0.0    0.0     21              1
6   0.0     0.0     0.25    0.0  0.38   0.25    184             1
7   0.0     0.69    0.34    0.0  0.34   0.0     261             1
8   0.0     0.0     0.0     0.0  0.9    0.0     25              1
9   0.0     0.0     1.42    0.0  0.71   0.35    205             1
10  0.0     0.0     0.0     0.0  0.0    0.0     23              0
11  0.48    0.0     0.0     0.0  0.48   0.0     37              0
12  0.12    0.0     0.25    0.0  0.0    0.0     491             0
13  0.08    0.08    0.25    0.2  0.0    0.25    807             0
14  0.0     0.0     0.0     0.0  0.0    0.0     38              0
15  0.24    0.0     0.12    0.0  0.0    0.12    227             0   
16  0.0     0.0     0.0     0.0  0.75   0.0     77              0
17  0.1     0.0     0.21    0.0  0.0    0.0     571             0
18  0.51    0.0     0.0     0.0  0.0    0.0     74              0
19  0.3     0.0     0.15    0.0  0.0    0.15    155             0

我想从之前的数据集中获取数据透视表,其中列(make,address all,3d,our,over,length_total)将使列y处理它们的平均值。下表是预期结果:

                    y   
                    1   0
make            0.048   0.183
address         0.173   0.008
all             0.509   0.098
3d              0.01    0.02
our             0.482   0.123
over            0.139   0.052
length_total    626.7   250

是否可以通过pandas.data对象的pivot_table方法获得所需的结果?如果是这样,怎么样?

有更有效的方法吗?

1 个答案:

答案 0 :(得分:1)

有些人喜欢使用stackunstack,但我更喜欢使用{ol}' pd.melt到"展平"或" unpivot"一个框架:

>>> df_m = pd.melt(df, id_vars="y")
>>> df_m.pivot_table(index="variable", columns="y")
                value         
y                   0        1
variable                      
3d              0.020    0.010
address         0.008    0.173
all             0.098    0.509
length_total  250.000  626.700
make            0.183    0.048
our             0.123    0.482
over            0.052    0.139

(如果您希望将原始列顺序保留为新的行顺序,则可以使用.loc对其进行索引,例如df2.loc[df.columns].dropna())。


Melting进行展平,并将y保留为列,将旧列名称作为名为"variable"的新列(如果您愿意,可以更改):

>>> pd.melt(df, id_vars="y").head()
   y variable  value
0  1     make   0.00
1  1     make   0.21
2  1     make   0.06
3  1     make   0.15
4  1     make   0.06

之后我们可以像往常一样打电话给pivot_table