2017-08-23 20 views
2

我有一個熊貓數據幀,看起來像下面這樣:演員大熊貓數據幀從長到寬不pd.pivot

df = pd.DataFrame([['joe', 21, 'M'], 
        ['jane', 22, 'F'], 
        ['Alice', 34, 'F']], 
        columns=['name', 'age', 'sex']) 

,看起來像這樣:

name age sex 
0 joe 21 M 
1 jane 22 F 
2 Alice 34 F 

此數據框顯然是一個3x3矩陣,我想用1X9矩陣,看起來像下面落得什麼:

name_1 age_1 sex_1 name_2 age_2 sex_2 name_3 age_3 sex_3 
0 joe  21  M jane  22  F Alice  34  F 

我不能我們e'pivot',因爲我沒有一列用作列而另一列用作值。我只是想移動所有的行,以便它們並排放置,並且我似乎無法用Python語言的方式來包裝我的頭。我是否需要遍歷行,將行附加到列表中,將列表變成數據框,然後重命名列?

回答

4

選項1
稍顯簡單版本

d = df.unstack() 
d.index = d.index.map('{0[0]}_{0[1]}'.format) 
d.to_frame().T 

    name_0 name_1 name_2 age_0 age_1 age_2 sex_0 sex_1 sex_2 
0 joe jane Alice 21 22 34  M  F  F 

選項2
複雜的事情,但可能更快

from numpy.core.defchararray import add 

cols = np.tile(df.columns.values, df.shape[0]).astype(str) 
rows = np.arange(1, df.shape[0] + 1).repeat(df.shape[1]).astype(str) 
vals = df.values.reshape(1, -1) 
pd.DataFrame(vals, columns=add(cols, add('_', rows))) 

    name_1 age_1 sex_1 name_2 age_2 sex_2 name_3 age_3 sex_3 
0 joe 21  M jane 22  F Alice 34  F 
+0

清潔和簡單。謝謝! – brittenb

3

試試這個,我打破步驟s。

df=df.reset_index() 
df=pd.melt(df,'index') 
df['index']=df['index']+1 

df.variable=df.variable+'_'+df['index'].astype(str) 
df.sort_values('index').drop('index',1).set_index('variable',drop=True).T 


Out[2375]: 
variable name_1 age_1 sex_1 name_2 age_2 sex_2 name_3 age_3 sex_3 
value  joe 21  M jane 22  F Alice 34  F