【3.6.1】Pandas--长转宽pivot

长型数据转为宽型数据可以通过透视的功能实现,类似于excel中的透视表功能。在pandas中用pivot方法实现。

DataFrame.pivot(index=None, columns=None, values=None)

index:[str ,object ,a list of str],透视的索引
columns:[str ,object ,a list of str],透视的列
values:[str, object ,a list of the previous],透视的值

长型数据:

l_df = pd.DataFrame({'foo': ['one', 'one', 'one', 'two', 'two','two'],
                   'bar': ['A', 'B', 'C', 'A', 'B', 'C'],
                   'cat':['alpha','alpha','alpha','beta','beta','beta'],
                   'baz': [1, 2, 3, 4, 5, 6],
                   'zoo': [4, 6, 8, 1, 2, 9]})
l_df

   foo bar    cat  baz  zoo
0  one   A  alpha    1    4
1  one   B  alpha    2    6
2  one   C  alpha    3    8
3  two   A   beta    4    1
4  two   B   beta    5    2
5  two   C   beta    6    9

选择foo列作为透视后的索引,bar列作为透视的列,里面的元素会展开成新数据框的列,baz作为透视的值,填充在新数据框中。

#透视数据

l_df.pivot(index='foo',columns='bar',values='baz')

bar  A  B  C
foo         
one  1  2  3
two  4  5  6

设置index为多个列名,透视表将具有多个行索引。

#多索引透视

l_df.pivot(index=['foo','bar'],columns='cat',values='baz')

cat      alpha  beta
foo bar             
one A      1.0   NaN
    B      2.0   NaN
    C      3.0   NaN
two A      NaN   4.0
    B      NaN   5.0
    C      NaN   6.0

设置columns为多个列名,透视表将具有多个列索引。

#多列透视

l_df.pivot(index='foo',columns=['bar','cat'],values='baz')

bar     A     B     C    A    B    C
cat alpha alpha alpha beta beta beta
foo                                 
one   1.0   2.0   3.0  NaN  NaN  NaN
two   NaN   NaN   NaN  4.0  5.0  6.0
设置values为多个列名。
l_df.pivot(index='foo',columns='bar',values=['baz','zoo'])


baz       zoo      
bar   A  B  C   A  B  C
foo                    
one   1  2  3   4  6  8
two   4  5  6   1  2  9

参考资料

药企,独角兽,苏州。团队长期招人,感兴趣的都可以发邮件聊聊:tiehan@sina.cn
个人公众号,比较懒,很少更新,可以在上面提问题,如果回复不及时,可发邮件给我: tiehan@sina.cn