如何使用 pandas 将 Series 重新排列为 DataFrame

How to rearrange a Series to DataFrame using pandas

我有一个 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

给你:

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

你很接近!

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

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
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