如何取消透视多列数据?
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
我正在尝试对列进行逆透视并从 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