【问题标题】:How to rearrange a Series to DataFrame using pandas如何使用 pandas 将 Series 重新排列为 DataFrame
【发布时间】:2015-11-05 07:15:37
【问题描述】:

我有一个Series,如下:

In [37]: ser
Out[37]: 
Aa    0
Ab    1
Ac    2
Ba    3
Bb    4
Bc    5
Ca    6
Cb    7
Cc    8
dtype: int3

我想将其重新排列为 DataFrame 为:

   a  b  c
A  0  1  2
B  3  4  5 
C  6  7  8

这是我没有运气的尝试:

In [38]: ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index}).to_frame())
Out[38]: 
      A   B   C
A a   0 NaN NaN
  b   1 NaN NaN
  c   2 NaN NaN
B a NaN   3 NaN
  b NaN   4 NaN
  c NaN   5 NaN
C a NaN NaN   6
  b NaN NaN   7
  c NaN NaN   8

编辑 我发现了以下关闭结果:

In [50]: ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index}).to_frame().transpose())
Out[50]: 
     a  b  c
A A  0  1  2
B B  3  4  5
C C  6  7  8

但是,它有一个MultiIndex

【问题讨论】:

    标签: python pandas dataframe series


    【解决方案1】:

    给你:

    ser.groupby(lambda i: i[0]).apply(lambda x: x.rename({i: i[1] for i in x.index})).unstack()
    

    你很接近!

    【讨论】:

      【解决方案2】:

      为了清楚起见,我会更详细。

      import pandas as pd
      import itertools
      
      # set up the Series
      labels = map(''.join, itertools.product('ABC', 'abc'))
      s = pd.Series(range(len(labels)), index=labels, name='data')
      
      # transform to desired DataFrame
      df = s.reset_index()
      df['capital'] = df['index'].map(lambda s:s[0])
      df['lowercase'] = df['index'].map(lambda s:s[1])
      df = df.pivot(index='capitals', columns='lowercase', values='data')
      

      这会将系列s

      Aa    0
      Ab    1
      Ac    2
      Ba    3
      Bb    4
      Bc    5
      Ca    6
      Cb    7
      Cc    8
      Name: data, dtype: int64
      

      到 DataFrame df

      lowercase  a  b  c
      capitals
      A          0  1  2
      B          3  4  5
      C          6  7  8
      

      【讨论】:

        【解决方案3】:
        In [235]:
        df = pd.DataFrame(data = { 'key' : ser.index.values , 'value' :ser.values })
        df
        Out[235]:
            key value
        0   Aa  0
        1   Ab  1
        2   Ac  2
        3   Ba  3
        4   Bb  4
        5   Bc  5
        6   Ca  6
        7   Cb  7
        8   Cc  8
        
        In [251]:
        df['key_1'] = df.key.str.extract('(^\w)')
        df
        Out[251]:
            key value   key_1   
        0   Aa  0          A    
        1   Ab  1          A    
        2   Ac  2          A    
        3   Ba  3          B    
        4   Bb  4          B    
        5   Bc  5          B    
        6   Ca  6          C    
        7   Cb  7          C    
        8   Cc  8          C    
        
        In [252]:
        df['key_2'] = df.key.str.extract('(\w$)')
        df
        Out[252]:
            key    value    key_1   key_2
        0   Aa         0    A       a
        1   Ab         1    A       b
        2   Ac         2    A       c
        3   Ba         3    B       a
        4   Bb         4    B       b
        5   Bc         5    B       c
        6   Ca         6    C       a
        7   Cb         7    C       b
        8   Cc         8    C       c
        
        In [253]:
        df.pivot(index='key_1' , columns='key_2' , values='value')
        Out[253]:
        key_2   a   b   c
        key_1           
        A       0   1   2
        B       3   4   5
        C       6   7   8
        

        【讨论】:

        • 您的解决方案是最快的!非常感谢。
        猜你喜欢
        • 2016-12-28
        • 1970-01-01
        • 2017-01-12
        • 2023-03-11
        • 1970-01-01
        • 1970-01-01
        • 2013-05-22
        • 2012-11-18
        • 1970-01-01
        相关资源
        最近更新 更多