2017-01-09 156 views
2

我有一個有多個列的熊貓數據框,我想將它「扁平化」爲兩列 - 一列爲列名,另一列爲值。例如。熊貓 - 多列到「列名 - 值」列

df1 = pd.DataFrame({'A':[1,2],'B':[2,3], 'C':[3,4]}) 

我怎樣才能將其轉換看起來像:

df2 = pd.DataFrame({'column name': ['A','A','B','B','C','C'], 'value': [1,2,2,3,3,4]}) 

回答

2

可以stack堆疊的所有列值到一個單一的,列,然後刪除第一級索引調用reset_index,覆蓋與列名你想要的,然後最終使用sort_values排序:

In [37]: 
df2 = df1.stack().reset_index(level=0, drop=True).reset_index() 
df2.columns = ['column name', 'value'] 
df2.sort_values(['column name', 'value'], inplace=True) 
df2 

Out[37]: 
    column name value 
0   A  1 
3   A  2 
1   B  2 
4   B  3 
2   C  3 
5   C  4 
+0

嗯,2分鐘的差異......你怎麼看? – jezrael

+2

@jezrael你的第一個發佈的答案是不正確的和不完整的,因此,爲什麼我發佈我的,它在事情的大計劃中很少 – EdChum

1

您可以通過stack重塑到MultiIndexSeries然後reset_indexsort_values

df2 = df1.stack().reset_index(level=0, drop=True).reset_index().sort_values('index') 
df2.columns = ['column name','value'] 
print (df2) 
    column name value 
0   A  1 
3   A  2 
1   B  2 
4   B  3 
2   C  3 
5   C  4 

一個與rename列排液indexcolumn name

df2 = df1.stack() 
     .reset_index(level=0, drop=True) 
     .reset_index(name='value') 
     .sort_values(['index']) 
     .rename(columns={'index':'column name'}) 
print (df2) 
    column name value 
0   A  1 
3   A  2 
1   B  2 
4   B  3 
2   C  3 
5   C  4 

如果兩列需要排序:

df2 = df1.stack().reset_index(level=0, drop=True).reset_index().sort_values(['index',0]) 
df2.columns = ['column name','value'] 
print (df2) 
    column name value 
0   A  1 
3   A  2 
1   B  2 
4   B  3 
2   C  3 
5   C  4