2017-01-09 2 views
2

複数の列を持つpandasデータフレームがあり、列名と値の2つの列だけを「平坦化」したいと考えています。例えば。pandas - 複数の列から "列名 - 値"列

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

することができますstackreset_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

あなたがMultiIndexSeriesstackによって再形成した後、sort_valuesreset_indexことができます。

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列と1行のソリューションindex~column 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 
関連する問題