Python 堆栈来自同一数据帧的列值

Python 堆栈来自同一数据帧的列值,python,pandas,numpy,Python,Pandas,Numpy,我想知道是否有可能使用几乎相同的名称从同一数据帧中堆叠列值。 我有以下数据框 import pandas as pd data = {'text':['hello','hi'], 'a':[1,2,], 'b':[2,1,], 'a.1':[3,4], 'b.1':[4,3] } 我有多个a。和b。所以它是a.N和b.N,但最终结果必须像下面的数据帧一样 data2 ={'text':['hello','hi',

我想知道是否有可能使用几乎相同的名称从同一数据帧中堆叠列值。 我有以下数据框

import pandas as pd

data = {'text':['hello','hi'],
        'a':[1,2,],
        'b':[2,1,],
        'a.1':[3,4],
        'b.1':[4,3]
        }
我有多个a。和b。所以它是a.N和b.N,但最终结果必须像下面的数据帧一样

data2 ={'text':['hello','hi','hello','hi'],'identifier':[0,0,1,1],
        'a':[1,2,3,4],
        'b':[2,1,4,3],
        }
标识符列只是为了知道它是如何堆叠的,例如,前2个值0,0来自原始列,1,1来自a.1和b.1。
我希望这一切都有意义。

这类似于pd.wide\u to\u long,只是您没有第一组的前缀

尝试使用自定义重命名函数,然后取消堆栈:

def rename_col(x):
    out = x.split('.')
    return (x,'0') if len(out)==1 else tuple(out)

df = df.set_index('text')
df.columns=df.columns.map(rename_col)

df.stack(level=1).reset_index()
输出:

    text level_1  a  b
0  hello       0  1  2
1  hello       1  3  4
2     hi       0  2  1
3     hi       1  4  3
                  a  b
text  identifier      
hello 0           1  2
hi    0           2  1
hello 1           3  4
hi    1           4  3

更新或者您可以使用另一个重命名功能使用
pd.wide\u to\u long

def rename_col(x): return x if x=='text' or '.' in x else x+'.0'

pd.wide_to_long(df.rename(columns=rename_col),
                i='text', j='identifier',
                stubnames=['a','b'],
                sep='.'
               )
输出:

    text level_1  a  b
0  hello       0  1  2
1  hello       1  3  4
2     hi       0  2  1
3     hi       1  4  3
                  a  b
text  identifier      
hello 0           1  2
hi    0           2  1
hello 1           3  4
hi    1           4  3

您可以创建标识符,但是这里有一种方法是使用
axis=1上的
groupby

u = df.set_index("text")
out = pd.concat([g.stack().droplevel(-1) for _,g in 
                 u.groupby(u.columns.str.split('.').str[0],axis=1)],axis=1,keys=u)


你在操作数据帧还是字典?你好!第一个选项完美地工作了关于第二个选项我有一个错误stubname不能与列名完全相同,但谢谢你它按照我的要求工作