我有一个数据框,其中有一列称为动作,并带有字典列表。格式为{source:int,action:string},我需要将其解析为每个新列,但是每个操作单元格中的记录数是可变的。

数据如下所示:

|Id  |action                                                     |
|1   |[{"E": 4, "action": "views"}, {"A": 58, "action": "views"}]|
|2   |[{"A": 74, "action": "clicks"}]                            |


我希望它看起来像这样:

|Id|Source|Value|Action|
|1 |E     |4    |views |
|1 |A     |58   |views |
|2 |A     |74   |clicks|


“操作”列中的词典数量最多为10

我已经尝试过几种解决方案,例如pandas DataFrame: normalize one JSON column and merge with other columns

但是它告诉我第一个解决方案未正确调用DataFrame,第二个解决方案的str没有属性值。甚至除此之外,这不是我需要的解决方案,因为我需要重命名列源并将A / E / etc值放入其中。

最佳答案

只需使用列表理解来重建您的DataFrame数据:

更新:action列是一个字符串字段,而不是Python数据结构。您可以使用json.loads对其进行预处理,这在从字符串中解析数据结构方面不易出错。

import json

# original dataframe
df = pd.DataFrame([
        (1, '[{"E": 4, "action": "views"}, {"A": 58, "action": "views"}]')
      , (2, '[{"A": 74, "action": "clicks"}]')
    ],
    columns=['Id', 'action']
)

# new dataframe
df_new = pd.DataFrame(
    [ (id, k, v, i['action']) for id,act in zip(df.Id, df.action.apply(json.loads))
                              for i in act
                              for k,v in i.items() if k != 'action'
    ],
    columns=['Id', 'Source', 'Value', 'Action']
)

print(new_df)
#   Id Source  Value  Action
#0   1      E      4   views
#1   1      A     58   views
#2   2      A     74  clicks

关于python - 数据框的一列是字典列表,我需要将其解析为新的单词,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/56091481/

10-12 21:58
查看更多