pandas - 将多列转换成“列名-值”列

3

我有一个包含多列的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个回答

3
你可以使用 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

嗯,两分钟的差异...你觉得呢? - jezrael
2
@jezrael,你第一篇回答是不正确和不完整的,这就是为什么我发表了我的回答,但在大局上这并不重要。 - EdChum

1
你可以通过 stack 转换成 MultiIndex Series,然后使用 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函数将列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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接