python - Pandas 在不手动指定级别的情况下在多索引列上融化 (Python 3.5.1)

标签 python pandas

我有一个看起来像这样的 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 设置为元组列表,其中每个元组中的第一个元素是第一列级别,第二个元素是第二列级别,第三个元素是第三列级别。

最佳答案

如果您不指定 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
...

但是,如果出于某种原因您确实需要生成列元组列表,您可以使用 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
...

关于python - Pandas 在不手动指定级别的情况下在多索引列上融化 (Python 3.5.1),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36431413/

相关文章:

python - 如何使用 urllib2 在 python 中下载 zip 文件?

python - 构建正则表达式以至少识别给定的间隔

python - 将数据帧转换为 numpy 数组时如何保持数据类型?

python - Pandas to_excel 不写换行符

python - 使用 bulkloader 从 Google App Engine 下载数据时出错

python - 如何解决 XGBoost SoftmaxMultiClassObj : label must be in [0, num_class) 错误?

python - 在 Python Pandas 中的多列中填充

python - 这些networkx错误表示在 Pandas 数据帧上设置过滤器后得到什么?

python-igraph 访问图的特定顶点

python - 在 Pandas 中将字符串转换为时间