Python Pandas按名称将多组列合并为多个目标列

Python Pandas按名称将多组列合并为多个目标列,python,pandas,melt,Python,Pandas,Melt,我想将一个数据帧的几组列合并成多个目标列。类似于提问和提问。但是,我需要通过列名而不是索引位置显式地执行此操作 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',

我想将一个数据帧的几组列合并成多个目标列。类似于提问和提问。但是,我需要通过列名而不是索引位置显式地执行此操作

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

对此,我们非常感谢您的建议。

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

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

有一种更有效的方法来解决这类涉及熔化多组不同色谱柱的问题<代码>pd。从宽到长是针对这些具体情况而构建的

pd.wide_to_long(df, stubnames=['a', 'b', 'c'], i='id', j='dropme', sep='_')\
  .reset_index()\
  .drop('dropme', axis=1)\
  .sort_values('id')

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

df.columns=df.columns.str.split(“”),expand=True)
同样有效。您是否解释为什么此“cols.groupby(cols.str.split(“”“').str[0])返回dict?返回一个dict。可能是因为在索引上执行算术不是常见的用例,通常我们需要组来代替。这是意外的行为,这就是我问的原因。有一个更直观的解决方案,它使用了
pd.wide\u to\u long
函数,它正是针对这种情况构建的。见下面我的答案。
pd.wide_to_long(df, stubnames=['a', 'b', 'c'], i='id', j='dropme', sep='_')\
  .reset_index()\
  .drop('dropme', axis=1)\
  .sort_values('id')

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