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不能与列名完全相同,但谢谢你它按照我的要求工作