Pandas按名称将几组列熔合到多个目标列中

时间:2016-08-10 01:23:10

标签: python pandas melt

我想将数据帧的几组列融合到多个目标列中。与问题Python Pandas Melt Groups of Initial Columns Into Multiple Target Columnspandas dataframe reshaping/stacking of multiple value variables into seperate columns类似。但是,我需要通过列名明确地执行此操作,而不是通过索引位置。

import pandas as pd
df = pd.DataFrame([('a','b','c',1,2,3,'aa','bb','cc'), ('d', 'e', 'f', 4, 5, 6, 'dd', 'ee', 'ff')],
                  columns=['a_1', 'a_2', 'a_3','b_1', 'b_2', 'b_3','c_1', 'c_2', 'c_3'])
df

原始数据帧:

    id   a_1  a_2  a_3  b_1  b_2  b_3  c_1  c_2  c_3
0   101   a    b    c    1    2    3    aa   bb   cc
1   102   d    e    f    4    5    6    dd   ee   ff

目标数据框

     id   a   b   c
0   101   a   1   aa
1   101   b   2   bb
2   101   c   3   cc
3   102   d   4   dd
4   102   e   5   ee
5   102   f   6   ff

对此方法的建议非常感激。

3 个答案:

答案 0 :(得分:9)

您可以根据列模式将列名转换为多索引,然后根据您需要的结果在特定级别进行堆栈:

import pandas as pd
df.set_index('id', inplace=True)
df.columns = pd.MultiIndex.from_tuples(tuple(df.columns.str.split("_")))
df.stack(level = 1).reset_index(level = 1, drop = True).reset_index()

# id    a   b    c      
#101    a   1   aa
#101    b   2   bb
#101    c   3   cc
#102    d   4   dd
#102    e   5   ee
#102    f   6   ff

答案 1 :(得分:8)

有一种更有效的方法可以解决涉及融合多组不同列的这类问题。 <是针对这些确切情况而构建的。

pd.wide_to_long

答案 2 :(得分:2)

cols = df.columns.difference(['id'])

pd.lreshape(df, cols.groupby(cols.str.split('_').str[0])).sort_values('id')
Out: 
    id  a   c  b
0  101  a  aa  1
2  101  b  bb  2
4  101  c  cc  3
1  102  d  dd  4
3  102  e  ee  5
5  102  f  ff  6