在Python中将 Dataframe Json列展平为新行

5hcedyr0  于 2022-10-23  发布在  Python
关注(0)|答案(2)|浏览(165)

我是Python的新手。我已从SQL查询结果中获取 Dataframe
|UserId|UserName|Reason_details|
| ------------ | ------------ | ------------ |
|851|Bob|[{“reasonId”:264,“reasonDescription”:“probited”,“reaonCodes”:[1,2]},{“easonId”:267,“reason Description”:“Expired”,“理性代码”:[25]}]|
|852|Jack|[{“reasonId”:273,“reasonDescription”:“受限”,“reaonCodes”:[29]}]|
我想通过展平Reason_details列来修改此 Dataframe 。每一个原因都在新行。
|UserId|UserName|Reason_id|Reson_description|Reason代码|
| ------------ | ------------ | ------------ | ------------ | ------------ |
|851|Bob|264|禁止|1|
|851|Bob|264|禁止|2|
|851 | Bob | 267 |过期| 25|
|852|杰克|273|限制|29|
我使用良好的旧for循环对源 Dataframe 的每一行进行迭代,使用json_loads读取Reason_details列中每个键的值,然后创建最终 Dataframe 。
但我觉得必须有更好的方法使用python中的dataframe和JSON函数来实现这一点。
PS:在我的实际数据集中,有63列和800万行,其中只有Reason_details列具有JSON值。因此,我现有的方法是对所有行进行非常低效的迭代,所有列首先在2D列表中转换它们,然后从中生成最终的 Dataframe 。

8yparm6h

8yparm6h1#

你能试试这个吗:

df=df.explode('Reason_details')
df = df.join(df['Reason_details'].apply(pd.Series)).drop('Reason_details',axis=1).explode('reasonCodes').drop_duplicates()
anhgbhbe

anhgbhbe2#

这里有一个稍微不同的方式

df[['UserId', 'UserName']].merge(df['Reason_details']
                                 .explode()      # convert list to rows
                                 .apply(pd.Series) # creates dict keys as column
                                 .explode('reasonCodes'), # convert reason code into rows
                                 left_index=True, # merge with original DF
                                 right_index=True)
UserId  UserName    reasonId    reasonDescription   reasonCodes
0      851  Bob              264    prohibited           1
0      851  Bob              264    prohibited           2
0      851  Bob              267    Expired             25
1      852  Jack             273    Restricted          29

相关问题