在没有手动指定级别的情况下在多索引列上进行Pandas融解(Python 3.5.1)

x33g5p2x  于 2023-02-06  发布在  Python
关注(0)|答案(3)|浏览(118)

我有一个Pandas DataFrame,看起来像这样:

df = pd.DataFrame({'col1': {0: 'a', 1: 'b', 2: 'c'},
                   'col2': {0: 1, 1: 3, 2: 5},
                   'col3': {0: 2, 1: 4, 2: 6},
                   'col4': {0: 3, 1: 6, 2: 2},
                   'col5': {0: 7, 1: 2, 2: 3},
                   'col6': {0: 2, 1: 9, 2: 5},
                  })
df.columns = [list('AAAAAA'), list('BBCCDD'), list('EFGHIJ')]

    A
    B       C       D
    E   F   G   H   I   J
0   a   1   2   3   7   2
1   b   3   4   6   2   9
2   c   5   6   2   3   5

我基本上只想对数据框进行melt,使每个列级别都成为一个新列,换句话说,使用pd.melt()可以非常简单地实现我想要的:

pd.melt(df, value_vars=[('A', 'B', 'E'),
                        ('A', 'B', 'F'),
                        ('A', 'C', 'G'),
                        ('A', 'C', 'H'),
                        ('A', 'D', 'I'),
                        ('A', 'D', 'J')])

然而,在我的真实的用例中,有许多初始列(比6大得多),如果我能把它泛化就太好了,这样我就不必精确地指定value_vars中的元组了。有没有一种方法可以用泛化的方式来做这件事?我基本上是在寻找一种方法来告诉pd.melt我只想将value_vars设置为一个元组列表,其中每个元组中的第一个元素是第一列级别,第二个是第二列级别,而第三元素是第三列级。

uyto3xhc

uyto3xhc1#

如果不指定value_vars,则默认使用所有列(未指定为id_vars):

In [10]: pd.melt(df)
Out[10]: 
   variable_0 variable_1 variable_2 value
0           A          B          E     a
1           A          B          E     b
2           A          B          E     c
3           A          B          F     1
4           A          B          F     3
...

但是,如果出于某种原因确实需要生成column-tuple列表,则可以使用df.columns.tolist()

In [57]: df.columns.tolist()
Out[57]: 
[('A', 'B', 'E'),
 ('A', 'B', 'F'),
 ('A', 'C', 'G'),
 ('A', 'C', 'H'),
 ('A', 'D', 'I'),
 ('A', 'D', 'J')]

In [56]: pd.melt(df, value_vars=df.columns.tolist())
Out[56]: 
   variable_0 variable_1 variable_2 value
0           A          B          E     a
1           A          B          E     b
2           A          B          E     c
3           A          B          F     1
4           A          B          F     3
...
ctrmrzij

ctrmrzij2#

我也有同样的问题,但我的基本数据集实际上只是一个3级多索引的系列。我从这篇博客文章中找到了将一个系列“融化”到一个数据框架中的答案:https://discuss.analyticsvidhya.com/t/how-to-convert-the-multi-index-series-into-a-data-frame-in-python/5119/2
基本上,您只需要在Series上使用DataFrame构造函数,它就可以执行您希望Melt执行的操作。

pd.DataFrame(series)
oxcyiej7

oxcyiej73#

我尝试使用pd.melt(),但无法使其正常运行。我发现使用df.unstack()要容易得多,它可以将其完全修改为长格式,然后使用df.pivot()将其转换回所需的格式。以下链接可能会有所帮助:
https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.unstack.htmlhttps://pandas.pydata.org/docs/reference/api/pandas.DataFrame.pivot.html

相关问题