构造数据透视表的另一种方法

时间:2018-10-04 19:17:16

标签: python pandas

>>> df = pd.DataFrame({'a': [1,1,1,1,2,2,2,2,3,3,3,3], 
           'b': [0,0,1,1,0,0,1,1,0,0,1,1,], 
                   'c': [5,5,5,8,9,9,6,6,7,8,9,9]})

>>> df
    a  b  c
0   1  0  5
1   1  0  5
2   1  1  5
3   1  1  8
4   2  0  9
5   2  0  9
6   2  1  6
7   2  1  6
8   3  0  7
9   3  0  8
10  3  1  9
11  3  1  9

是否有获取此输出的替代方法?

>>> pd.pivot_table(df, index=['a','b'], columns='c', aggfunc=len, fill_value=0).reset_index()
c  a  b  5  6  7  8  9
0  1  0  2  0  0  0  0
1  1  1  1  0  0  1  0
2  2  0  0  0  0  0  2
3  2  1  0  2  0  0  0
4  3  0  0  0  1  1  0
5  3  1  0  0  0  0  2

我有一个很大的df(>〜1m行),其中len(df.c.unique())是134,所以pivot永远占据。

考虑到此结果在一秒钟之内就会在我的实际df中返回:

>>> df.groupby(by = ['a', 'b', 'c']).size().reset_index()
   a  b  c  0
0  1  0  5  2
1  1  1  5  1
2  1  1  8  1
3  2  0  9  2
4  2  1  6  2
5  3  0  7  1
6  3  0  8  1
7  3  1  9  2

我是否可以根据上面的输出手动构建所需的结果

1 个答案:

答案 0 :(得分:4)

1。这是一个:

.info {
    padding: 20px;
    position: absolute;
    top: 80px;
    left: 0px;
    text-align: right;
    font-family: Roboto;
    color: white;
}

输出:

df.groupby(by = ['a', 'b', 'c']).size().unstack(fill_value=0).reset_index()

2。这是另一种方式:

c  a  b  5  6  7  8  9
0  1  0  2  0  0  0  0
1  1  1  1  0  0  1  0
2  2  0  0  0  0  0  2
3  2  1  0  2  0  0  0
4  3  0  0  0  1  1  0
5  3  1  0  0  0  0  2

输出:

pd.crosstab([df.a,df.b], df.c).reset_index()