如何从 pandas DataFrame 中“取消透视”特定列?

Posted

技术标签:

【中文标题】如何从 pandas DataFrame 中“取消透视”特定列?【英文标题】:How can I "unpivot" specific columns from a pandas DataFrame? 【发布时间】:2014-06-14 18:27:20 【问题描述】:

我有一个 pandas DataFrame,例如:

x = DataFrame.from_dict('farm' : ['A','B','A','B'], 
                         'fruit':['apple','apple','pear','pear'], 
                         '2014':[10,12,6,8], 
                         '2015':[11,13,7,9])

即:

   2014  2015 farm  fruit
0    10    11    A  apple
1    12    13    B  apple
2     6     7    A   pear
3     8     9    B   pear

我怎样才能把它转换成这个:?

  farm  fruit  value  year
0    A  apple     10  2014
1    B  apple     12  2014
2    A   pear      6  2014
3    B   pear      8  2014
4    A  apple     11  2015
5    B  apple     13  2015
6    A   pear      7  2015
7    B   pear      9  2015

我已经尝试过stackunstack,但没能成功。

谢谢!

【问题讨论】:

Melt 是这个函数的好名字 【参考方案1】:

这可以通过pd.melt()来完成:

# value_name is 'value' by default, but setting it here to make it clear
pd.melt(x, id_vars=['farm', 'fruit'], var_name='year', value_name='value')

结果:

  farm  fruit  year  value
0    A  apple  2014     10
1    B  apple  2014     12
2    A   pear  2014      6
3    B   pear  2014      8
4    A  apple  2015     11
5    B  apple  2015     13
6    A   pear  2015      7
7    B   pear  2015      9

[8 rows x 4 columns]

我不确定“melt”作为这种操作的名称有多常见,但这就是它在 R 的 reshape2 包中的名称,这可能是此处名称的灵感来源。

【讨论】:

令人难以置信的简单和真棒名字 - 融化!非常感谢! 'melt' 做得非常好。 非常感谢。这正是我想要的。

以上是关于如何从 pandas DataFrame 中“取消透视”特定列?的主要内容,如果未能解决你的问题,请参考以下文章

Pandas DataFrame 取消科学计数法打印

使用 pandas DataFrame.explode() 后如何创建新的“索引”列?

Pandas:如何从给定(行,列)对列表的 DataFrame 中检索值?

如何从 Pandas DataFrame 中提取 URL?

如何从pandas DataFrame中制作字典列表?

如何从 print() 编写的字符串中获取 Python pandas DataFrame?