代码之家  ›  专栏  ›  技术社区  ›  Umar.H

用多管柱熔化DF

  •  0
  • Umar.H  · 技术社区  · 6 年前

    我有下面的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
    

    我想做的是删除“review”并将其放在自己的列中,如下所示

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

    我一直试图做宽到长的事,但我 认为 我需要在这里使用某种级别的多重索引,或者我想得太多了。

    注意事项:

    我的df是824列长和324行 我的变量是按行排列的,ID是列标题的日期。

    1 回复  |  直到 6 年前
        1
  •  1
  •   It_is_Chris    6 年前

    如果我明白你在找什么…

    从这个数据框架开始,我相信这就是你所拥有的:

        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