Как преобразовать много столбцов в строки в python данных? - PullRequest
0 голосов
/ 20 марта 2020

У меня есть фрейм данных со следующей структурой. Мне нужно перенести все значения в столбцах code1, code2, code3 в разные строки под одним и тем же name. Аналогично для text столбцов.

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

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Для каждого имени вы можете добавить новую строку с их кодом и текстом в отдельном кадре данных.

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)
0 голосов
/ 20 марта 2020

Начиная с 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...