拆分Pandas Column中的字典/列表并转换为新的数据帧

时间:2018-03-17 10:56:42

标签: python pandas dictionary dataframe data-analysis

我将数据保存在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 

任何人都可以帮助我..

1 个答案:

答案 0 :(得分: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