Таяние Df с несколькими столбцами - PullRequest
0 голосов
/ 29 ноября 2018

У меня есть следующий DF

ID,     1,      2,      3              #Columns 
0,Date, Review, Average, Review # Observations
1,01/01/18 2,   4,      3      # Date and Review Score
2,02/01/18 1,   2,      4      #Date and Review Score

Я пытаюсь превратить этот DF в следующее, используя приведенный ниже код, я подхожу ближе:

df = pd.melt(df,id_vars=['ID'],var_name=['Store'],value_name='Score').fillna(0).set_index('ID')

этот процесс:

           Store    Score
ID      
Date        
01/01/18    1       Review
01/01/18    1       2
02/01/18    1       1

Я хотел бы удалить «Отзыв» и поместить его в свой собственный столбец, что-то вроде следующего:

           Store    Review Type Score
ID      
Date        
01/01/18    1,      Review,    1
02/01/18    1,      Review,    2

У меня естьпытался делать от широкого до длинного, но я думаю Мне нужно было бы использовать какой-то уровень мультииндексации здесь, или, может быть, я слишком обдумываю это.

Соображения:

мой DF имеет длину 824 столбца и 324 строки, мои переменные расположены по строкам вместе с датой, а ID является заголовком столбца.

1 Ответ

0 голосов
/ 29 ноября 2018

Если я понимаю, что вы ищете ...

начиная с этого фрейма данных, который, как я полагаю, у вас есть:

    ID           1         2       3
0   Date       Review   Average   Review
1   01/01/18     2         4       3
2   02/01/18     1         2       4

при условии, что вы делаете свое pd.melt()затем вам остается:

new_df = pd.melt(df,id_vars=['ID'],var_name=['Store'],value_name='Score').fillna(0).set_index('ID')

          Store    Score
ID      
Date        1      Review
01/01/18    1      2
02/01/18    1      1
Date        2      Average
01/01/18    2      4
02/01/18    2      2
Date        3      Review
01/01/18    3      3
02/01/18    3      4

, тогда вы можете сделать что-то вроде:

# sort index so all the 'Date' values are at the bottom
new_df.sort_index(inplace=True) 

# create a new df of just the dates becuase that is your review types
review_types = new_df.loc['Date']

# rename column to review types
review_types.rename(columns={'Score':'Review Type'}, inplace=True)

# remove new_df.loc['Date']
# new_df = new_df.drop(new_df.tail(len(review_types)).index).reset_index()

# UPDATED removal of new_df.loc['Date']
# I recommend removing the date values by doing this and not using .tail()
new_df = new_df[~new_df.index.str.contains('Date')].reset_index()

# rename ID column to Date
new_df.rename(columns={'ID':'Date'}, inplace=True)

# merge your two dataframes together
new_df.merge(review_types, on='Store')

, что даст вам:

    Date      Store  Score  Review Type
0   01/01/18    1     2     Review
1   02/01/18    1     1     Review
2   01/01/18    2     4     Average
3   02/01/18    2     2     Average
4   01/01/18    3     3     Review
5   02/01/18    3     4     Review
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...