如何将嵌套列拆分为Python中的几个新列?

时间:2018-01-14 22:23:28

标签: python pandas dataframe

在Python中,我正在使用数据集来确定用户的反应与帖子范围的关系。我的数据集以这种方式构建,Reactions列是嵌套的:

   PostID    Reach    Reaction
   01        787767   {"like":49852,"wow":8017,"haha":3200,"anger":3}
   02        973183   {"like":57911,"wow":3013,"haha":8017,"anger":15}
   03        ...      ...

我想重组数据并创建单独的反应列,以便数据框看起来像这样:

   PostID    Reach    like     wow     haha     anger
   01        787767   49852    8017    3200     3
   02        973183   57911    3013    8017     15
   03        ...      ...

2 个答案:

答案 0 :(得分:3)

将词典转换为Panda Series

pd.concat([df.iloc[:,:2], df.Reaction.apply(pd.Series)],axis=1)
#   PostID   Reach  anger  haha   like   wow
#0       1  787767      3  3200  49852  8017
#1       2   97318     15  8017  57911  3013

答案 1 :(得分:2)

有很多方法可以做到这一点,假设您有一列 JSON数据。一种简单的方法是apply json.loads操作,将字符串转换为dicts,然后使用DataFrame.from_recordsjson_normalize将其加载。

v = pd.DataFrame.from_records(df.Reaction.apply(pd.json.loads))

或者,

v = pd.io.json.json_normalize(df.Reaction.apply(pd.json.loads).tolist())

最后,concat创建结果。

pd.concat([df.drop('Reaction', 1), v], axis=1)

   PostID   Reach  anger  haha   like   wow
0       1  787767      3  3200  49852  8017
1       2  973183     15  8017  57911  3013

另一方面,如果您有一列词典,那么这应该更快 -

v = pd.DataFrame.from_records(df.Reaction) 
pd.concat([df.drop('Reaction', 1), v], axis=1)

   PostID   Reach  anger  haha   like   wow
0       1  787767      3  3200  49852  8017
1       2  973183     15  8017  57911  3013