pandas - 多列到"列名 - 值"列

时间:2017-01-09 13:10:08

标签: python pandas stack multiple-columns reshape

我有一个包含多列的pandas数据框,我希望"展平"它只有两列 - 一列是列名,另一列是值。 E.g。

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 个答案:

答案 0 :(得分:2)

您可以EnumThing doodah = new EnumThing(EnumThing.SomeConstant.CONSTANT1); 将所有列值堆叠到一个列中,然后删除调用stack的第一级索引,用您想要的列覆盖列名,然后最后使用{{ 1}}:

reset_index

答案 1 :(得分:1)

您可以stack重塑MultiIndex Series,然后reset_index sort_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

renameindexcolumn 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