Начиная с df
, как показано ниже (для согласованности запишите все заголовки в нижнем регистре):
# name code1 text1 code2 text2 code3 text3
#0 Alexa 362 Eng 639 scien 563 maths
#1 john 23 cri 36 ball 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
, чтобы получить все коды в одном столбце соответственно df2
для текстовых значений var_name
(«столбец исходного кода») - это то, что pd.melt
создает, иногда полезно, но не в вашем случае, поэтому удалите этот столбец; то же самое с «исходным текстовым столбцом» - , используйте
difference
и concat
для построения требуемого df