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_indexMultiIndex 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)的索引抽取单行或者多行数据其中多行索引需要嵌入在列表方括号[]中或使用:符号形成起始和终止范围索引

熊猫数据框使用列作为行[重复]

Python Pandas——在多列上融化、旋转、转置

如何在 QTableView 中复制和粘贴多行/列(来自 pandas 数据框的数据源)? [复制]

pandas 筛选指定行或者列的数据

pandas的DataFrame对象抽取“整列”或者“整行”数据