Pandas 使用堆栈或融化(使用列作为行),多行作为列标题
Posted
技术标签:
【中文标题】Pandas 使用堆栈或融化(使用列作为行),多行作为列标题【英文标题】:Pandas using stack or melt(using columns as rows) with multiple rows as column header 【发布时间】:2021-02-17 03:44:39 【问题描述】:我需要使用 melt 函数 (pandas) 将我的数据表转换为一维格式,但我有两行的列,根据我的研究,我必须使用多索引来定义这些行作为列。
例如:
df.columns = pd.MultiIndex.from_arrays(
df.iloc[:2].apply(list, 1))
df = df.iloc[2:].reset_index(drop=True)
之后当我应用融化功能时:
df = df.melt(id_vars=df.columns[[0,1]],
var_name='columns', value_name='Value')
我收到此错误:ValueError("Can only tuple-index with a MultiIndex") ValueError: Can only tuple-index with a MultiIndex
我拥有的数据格式:
A B C
D E F
X Y 1 2 3
Z T 4 5 6
我需要达到的数据格式:
X Y A D 1
X Y B E 2
X Y C F 3
Z T A D 4
Z T B E 5
Z T C F 6
我对python不是很有经验,所以如果你能帮助我,我会很高兴。提前致谢
【问题讨论】:
请与预期输出共享示例数据。不是图片。 【参考方案1】:使用DataFrame.rename_axis
设置新的列名称,通过DataFrame.stack
重塑,最后通过Series.reset_index
将MultiIndex Series
转换为DataFrame
:
df1 = df.rename_axis(['a','b'], axis=1).stack(level=[0,1]).reset_index(name='c')
在DataFrame.melt
中只能使用一个级别,不能同时使用两个级别:
df2 = df.melt(col_level=0, ignore_index=False)
df3 = df.melt(col_level=1, ignore_index=False)
#failed
df4 = df.melt(col_level=[0,1], ignore_index=False)
【讨论】:
以上是关于Pandas 使用堆栈或融化(使用列作为行),多行作为列标题的主要内容,如果未能解决你的问题,请参考以下文章
pandas使用iloc函数基于dataframe数据行(row)的索引抽取单行或者多行数据其中多行索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引