取消堆叠数据框并保留列

Posted

技术标签:

【中文标题】取消堆叠数据框并保留列【英文标题】:Unstack dataframe and keep columns 【发布时间】:2017-05-29 15:18:22 【问题描述】:

我有一个过于“紧凑”的 DataFrame。 DataFrame 目前是这样的:

> import numpy as np
> import pandas as pd

> df = pd.DataFrame('foo': ['A','B'],
               'bar': ['1', '2'],
               'baz': [np.nan, '3'])
  bar  baz foo
0   1  NaN   A
1   2    3   B

而且我需要将它“拆散”成这样:

> df = pd.DataFrame('foo': ['A','B', 'B'],
               'type': ['bar', 'bar', 'baz'],
               'value': ['1', '2', '3'])

  foo type value
0   A  bar     1
1   B  bar     2
2   B  baz     3

无论我如何尝试旋转,我都无法正确。

【问题讨论】:

【参考方案1】:

使用melt()方法:

In [39]: pd.melt(df, id_vars='foo', value_vars=['bar','baz'], var_name='type')
Out[39]:
  foo type value
0   A  bar     1
1   B  bar     2
2   A  baz   NaN
3   B  baz     3

In [38]: pd.melt(df, id_vars='foo', value_vars=['bar','baz'], var_name='type').dropna()
Out[38]:
  foo type value
0   A  bar     1
1   B  bar     2
3   B  baz     3

【讨论】:

【参考方案2】:

将您的索引设置为 foo,然后堆栈:

df.set_index('foo').stack()

foo     
A    bar    1
B    bar    2
     baz    3
dtype: object

【讨论】:

这给出了一个系列而不是一个数据帧 @Rémi,添加 .reset_index() 会给你想要的结果 ;-) 确实,它也有效。抱歉@Steven G,我无法将两个答案都标记为正确。

以上是关于取消堆叠数据框并保留列的主要内容,如果未能解决你的问题,请参考以下文章

根据分隔符拆分列,然后在保留其他列的情况下取消透视结果

取消嵌套命名列表列时保留名称

"取消融化 "Dataframe并保留其余列?蟒蛇潘达

移动居中图像/删除左边框并保留大小

Laravel/Ajax:刷新表格将新数据堆叠在底部(旧数据保留)

设置 QDialog 框并保留对 QDialog 中元素的访问的最佳方法?