如何取消透视多列数据?

how to un-pivot multi-column data?

我正在尝试对列进行逆透视并从 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 

您可以考虑 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 在月份列中结束)

一种可能的方法是使用 MultiIndex and stack。对于此解决方案,我假设 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