【问题标题】:Splitting dictionary/list inside a Pandas Column and convert as new dataframe在 Pandas Column 中拆分字典/列表并转换为新数据框
【发布时间】:2018-08-26 08:56:05
【问题描述】:

我将数据保存在 Excel 中。我正在使用 Python2.7 查询这些数据并将其转换为 Pandas DataFrame。我的数据框中有一个名为 category 的列。它里面有一个值的字典(或列表?)。 DataFrame 如下所示:

[1] df
ID                                          CATEGORY
1                                       {60: 'SHOES'}
2                                    {46: 'HARDWARE'}
3                                       {60: 'SHOES'}
4                          {219: 'GOVERNMENT OFFICE'}
5                         {87: 'ARCADES',60: 'SHOES'}

我需要将此列拆分为单独的列,以便 DataFrame 如下所示:

[2] df2
CATEGORY_ID                   CATEGORY_NAME
60                                    SHOES
46                                 HARDWARE
219                       GOVERNMENT OFFICE
87                                  ARCADES

我需要在我的数据框中添加一个新列

[3] df
ID           CATEGORY_id         
1                    60
2                    46
3                    60
4                   219 
5                 87,60 

任何人请帮我解决这个问题..

【问题讨论】:

    标签: python pandas dictionary dataframe data-analysis


    【解决方案1】:

    我认为你需要:


    import ast
    df = (pd.DataFrame(df['CATEGORY'].apply(ast.literal_eval).values.tolist())
           .stack()
           .reset_index(level=0, drop=True)
           .reset_index()
           .drop_duplicates()
           .rename(columns={'index':'CATEGORY_ID', 0:'CATEGORY_NAME'}))
    print (df)
       CATEGORY_ID      CATEGORY_NAME
    0           60              SHOES
    1           46           HARDWARE
    3          219  GOVERNMENT OFFICE
    5           87            ARCADES
    

    编辑:解决方案有点简化,要加入重复的CATEGORY_ID 使用groupbyjoin

    import ast
    df = (pd.DataFrame(df['CATEGORY'].apply(ast.literal_eval).values.tolist(), index=df['ID'])
           .stack()
           .reset_index()
           .rename(columns={'level_1':'CATEGORY_ID', 0:'CATEGORY_NAME'})
           )
    print (df)
       ID  CATEGORY_ID      CATEGORY_NAME
    0   1           60              SHOES
    1   2           46           HARDWARE
    2   3           60              SHOES
    3   4          219  GOVERNMENT OFFICE
    4   5           60              SHOES
    5   5           87            ARCADES
    
    
    df1 = df.groupby('ID')['CATEGORY_ID'].apply(lambda x: ', '.join(x.astype(str))).reset_index()
    print (df1)
       ID CATEGORY_ID
    0   1          60
    1   2          46
    2   3          60
    3   4         219
    4   5      60, 87
    

    【讨论】:

    • 我更新了我还需要一件事的问题,请帮我解决这个问题
    • @Hrithu - 只需要CATEGORY_IDCATEGORY_NAME ?
    • CATEGORY_ID 足够
    猜你喜欢
    • 2020-10-27
    • 2020-10-26
    • 2014-06-12
    • 1970-01-01
    • 2018-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    相关资源
    最近更新 更多