2015-11-05 60 views
1

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

編輯 我已經找到了緊跟reuslt:

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

回答

4

在這裏你去:

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 

到數據幀df

lowercase a b c 
capitals 
A   0 1 2 
B   3 4 5 
C   6 7 8 
2
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 
+0

您的解決方案是最快的國家之一!非常感謝。 – Eastsun

+0

不客氣:),很高興它有幫助 –