构建数据透视表的替代方法

托尼
>>> 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. 这是一个:

df.groupby(by = ['a', 'b', 'c']).size().unstack(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

2. 这是另一种方式:

pd.crosstab([df.a,df.b], df.c).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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章