如何在python数据框架中将许多列转换为行?

如何在python数据框架中将许多列转换为行?,python,dataframe,transpose,Python,Dataframe,Transpose,我有一个具有以下结构的数据帧。我需要将code1、code2、code3列中的所有值放入同一名称下的不同行中。类似地,对于文本列 Name Code1 text1 code2 text2 code3 text3 Alexa 362 Eng 639 scien 563 maths john 23 cri 36 ball 03 value 我想让它看起来像 Name Cod

我有一个具有以下结构的数据帧。我需要将
code1
code2
code3
列中的所有值放入同一
名称下的不同行中。类似地,对于
文本

Name      Code1   text1  code2  text2  code3  text3     
Alexa     362     Eng    639    scien  563    maths
john      23      cri    36     ball   03     value

我想让它看起来像

Name      Code   text 
Alexa     362    Eng    
Alexa     639    scien  
Alexa     563    maths
john      23     cri    
john      36     ball   
john      03     value


对于每个名称,可以在单独的数据框中添加一个新行及其代码和文本

r, c = df.shape  # original dataframe shape
df2 = pd.DataFrame()  # Create a new dataframe
for i in range(r):
    name = df.iloc[i, 0]
    for j in range(1, c, 2):
        df2 = df2.append({'Name': name, 'Code': df.iloc[i, j], 'Text': df.iloc[i, j + 1]},ignore_index=True)
print(df2)

df
开头,如下所示(注意所有标题均为小写,以确保一致性):

执行以下操作:

df1=pd.melt(df, id_vars=["name"], value_vars=df[['code1','code2','code3']], var_name='initial code column', value_name="code")
df1=df1.drop(columns=['initial code column'])

df2=pd.melt(df, id_vars=["name"], value_vars=df[['text1','text2','text3']], var_name='initial text column', value_name="text")
df2=df2.drop(columns=['initial text column'])    #you don't need this either

diff= df2[df2.columns.difference(df1.columns)]
df=pd.concat([df1,diff],axis=1)
#    name  code   text
#0  Alexa   362    Eng
#1   john    23    cri
#2  Alexa   639  scien
#3   john    36   ball
#4  Alexa   563  maths
#5   john     3  value
输出:

df1=pd.melt(df, id_vars=["name"], value_vars=df[['code1','code2','code3']], var_name='initial code column', value_name="code")
df1=df1.drop(columns=['initial code column'])

df2=pd.melt(df, id_vars=["name"], value_vars=df[['text1','text2','text3']], var_name='initial text column', value_name="text")
df2=df2.drop(columns=['initial text column'])    #you don't need this either

diff= df2[df2.columns.difference(df1.columns)]
df=pd.concat([df1,diff],axis=1)
#    name  code   text
#0  Alexa   362    Eng
#1   john    23    cri
#2  Alexa   639  scien
#3   john    36   ball
#4  Alexa   563  maths
#5   john     3  value
评论:

df1=pd.melt(df, id_vars=["name"], value_vars=df[['code1','code2','code3']], var_name='initial code column', value_name="code")
df1=df1.drop(columns=['initial code column'])

df2=pd.melt(df, id_vars=["name"], value_vars=df[['text1','text2','text3']], var_name='initial text column', value_name="text")
df2=df2.drop(columns=['initial text column'])    #you don't need this either

diff= df2[df2.columns.difference(df1.columns)]
df=pd.concat([df1,diff],axis=1)
#    name  code   text
#0  Alexa   362    Eng
#1   john    23    cri
#2  Alexa   639  scien
#3   john    36   ball
#4  Alexa   563  maths
#5   john     3  value
  • 使用
    pd.melt
    创建
    df1
    ,以获得一列下的所有代码, 分别
    df2
    用于文本值
  • var\u name
    (“初始代码列”)是指
    pd.melt
    创建,有时有用,但不适用于您的情况,所以请删除此列;相同的 带有“初始文本列”
  • 使用
    difference
    concat
    构建所需的
    df

你可以查看这篇帖子:它只解决了一半的任务。