【问题标题】:How do I flatten JSON Array Elements in a pandas DataFrame如何在 pandas DataFrame 中展平 JSON 数组元素
【发布时间】:2018-10-01 13:08:50
【问题描述】:

我有一个输入 DataFrame df 如下(ID 不是 1,2,3):

| id    | name                                                                                  |
|-------|---------------------------------------------------------------------------------------|
| a1xy  | [  {  "event": "sports",   "start": "100"},  {  "event": "lunch",  "start": "121" } ] |
| a7yz  | [  {  "event": "lunch",   "start": "109"},  {  "event": "movie",  "start": "97" } ]   |
| bx4y  | [  {  "event": "dinner",   "start": "78"},  {  "event": "sleep",  "start": "25" } ]   |

我想展平 JSON 数组元素,以便我的结果输出为:

| id    | name.event | name.start |
|-------|------------|------------|
| a1xy  | sports     | 100        |
| a1xy  | lunch      | 121        |
| a7yz  | lunch      | 109        |
| a7yz  | movie      | 97         |
| bx4y  | dinner     | 78         |
| bx4y  | sleep      | 25         |

如何在 Python 中做到这一点?

【问题讨论】:

  • 能否提供数据的来源,以便重新创建这个变得容易

标签: python arrays json pandas


【解决方案1】:

您可以使用 python json 库通过 pandas 应用函数解析 JSON 并创建一个列表,您可以稍后使用 pandas concat 函数将其转换为数据帧,然后更改该数据帧的索引。

import json
ll = df.name.apply(lambda row: pd.DataFrame(json.loads(row))).tolist()
new_df = pd.concat(ll)
new_df.index = pd.Series(new_df.index).shift(-1).fillna(0).cumsum()

new_df

      event start
1.0  sports   100
1.0   lunch   121
2.0   lunch   109
2.0   movie    97
3.0  dinner    78
3.0   sleep    25

【讨论】:

    【解决方案2】:

    使用apply(pd.DataFrame)

    k= df.name.apply(pd.DataFrame).tolist()
    
    final_df = pd.concat(k)
    final_df.index = pd.Series(final_df.index).shift(-1).fillna(0).cumsum()
    
    final_df
        event start
    1  sports   100
    1   lunch   121
    2   lunch   109
    2   movie    97
    3  dinner    78
    3   sleep    25
    

    【讨论】:

    • 输入数据框列 id 中的值不会是 1,2,3;它将是 varchar,例如 a1xy、a7yz、bx4y。可以修改代码以反映这一点吗?
    • 我没有在 'df.name.aply..' 中使用 'name' 变量。我收到一个 AttributeError ..
    • AttributeError: 'DataFrame' 对象没有属性 'name'
    • @Chiel 在此特定示例中,name 是列的名称。您应该将其更改为列的实际名称。例如,如果您的列名是name,那么df['name']df.name 应该可以正常工作:但如果您的列名是agesales,那么您应该使用df['age'](或df.age )和df['sales'](或df.sales
    猜你喜欢
    • 2018-09-02
    • 2018-09-24
    • 2019-11-05
    • 1970-01-01
    • 2021-05-07
    • 1970-01-01
    • 2016-12-01
    • 2019-10-24
    • 2020-09-05
    相关资源
    最近更新 更多