如何取消透视多列数据?

Posted

技术标签:

【中文标题】如何取消透视多列数据?【英文标题】:how to un-pivot multi-column data? 【发布时间】:2020-10-16 22:00:11 【问题描述】:

我正在尝试 Unpivot 列并从 pandas 数据框中获取 1 个属性和 2 个值,有人可以帮助我吗?

原始数据:

 id Jan-Value1 Jan-Value2 Feb-Value1 Feb-Value2
 1  1          10         2          15
 2  0          5          3          20

希望输出:

 id Month Value1 Value2
 1  Jan   1      10
 1  Feb   2      15
 2  Jan   0      5
 2  Feb   3      20 

【问题讨论】:

【参考方案1】:

一种可能的方法是使用MultiIndexstack。对于这个解决方案,我假设 id 是数据框的索引:

#df.set_index('id',inplace=True)  #set 'id' as index

#creating a Multiindex using existing columns 
df.columns = df.columns.str.split('-', expand=True).swaplevel(0,1)

#stacking the dataframe
df = df.stack().reset_index()

#renaming the column 
df.rename(columns='level_1':'Month',inplace=True)
print(df)

输出

   id Month  Value1  Value2
0   1   Feb       2      15
1   1   Jan       1      10
2   2   Feb       3      20
3   2   Jan       0       5

【讨论】:

添加了答案。请让我知道这对你有没有用。如果确实如此,请考虑接受/勾选答案【参考方案2】:

你可以考虑 pandas.wide_to_long():

import pandas as pd

df = pd.DataFrame(
"Jan-Value1": [1, 0],
"Jan-Value2": [10, 5],
"Feb-Value1": [2, 3],
"Feb-Value2": [15,20]
)

df.columns = ["-".join(col.split("-")[::-1]) for col in df.columns]

df["id"] = df.index

transformed_df = pd.wide_to_long(df, ["Value1", "Value2"], i="id", j="Month", sep="-", suffix="\w+")

由于 pandas 要求后缀以列的值结尾,因此我最终颠倒了列名的顺序(没有该转换,Value1 和 Value2 以月列结尾)

【讨论】:

以上是关于如何取消透视多列数据?的主要内容,如果未能解决你的问题,请参考以下文章

取消透视到 Oracle 中的多个列

如何在熊猫数据透视表上添加列(多列)

Excel中数据透视选择了多列数据后,会出现一个表头,这个是啥原因,怎么删除啊。

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

基于 SQL Server 中的一列透视多列

使用 Laravel 数据透视表的多行和多列输入表单