我有一个包含多列的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]})
我有一个包含多列的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]})
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
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
使用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