【问题标题】:convert JSON data inside a new columns在新列中转换 JSON 数据
【发布时间】:2021-12-27 16:33:27
【问题描述】:

我有这样的数据框:

id    date         value   
1     2021-09-01   [{'value': 'Keyman', 'sum': 8932.199999999999}
                   {'value': 'Suluboya', 'sum': 5896.7499999999945}]

2     2021-10-01   [{'value': 'Atelier', 'sum': 5595.299999999992}
                   {'value': 'Atölye4D', 'sum': 3538.7299999999987}]

预期输出:

idx    date        value       sum
1     2021-09-01   Keyman      8932.199999999999 
2     2021-09-01   Suluboya    5896.7499999999945            
3     2021-10-01   Atelier     5595.299999999992
4     2021-10-01   Atölye4D    3538.7299999999987
                 

我试过了:

df = pd.json_normalize(df['value'][0])

这仅适用于第一行。它有效,但还有很多数据,我相信还有更短的方法。我也试过了。

def only_dict(d):

    return ast.literal_eval(d) if pd.notnull(d) else {}

dfy = json_normalize(df['value'].apply(only_dict).tolist()).add_prefix('_')

但我收到此错误:

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

【问题讨论】:

标签: python json pandas dataframe


【解决方案1】:

假设你的 df 是:

In [577]: df = pd.DataFrame({'id':[1,2], 'date':['2021-09-01', '2021-10-01'], 'value':[[{'value': 'Keyman', 'sum': 8932.199999999999},{'value': 'Suluboya', 'sum': 5896.7499999999945}], [{'value': 'Atelier', 'sum': 5595.299
     ...: 999999992},{'value': 'Atölye4D', 'sum': 3538.7299999999987}]]})

In [578]: df
Out[578]: 
   id        date                                              value
0   1  2021-09-01  [{'value': 'Keyman', 'sum': 8932.199999999999}...
1   2  2021-10-01  [{'value': 'Atelier', 'sum': 5595.299999999992...

您可以将df.explodedf.apply 一起使用:

In [581]: df1 = df.explode('value')

In [585]: df1 = pd.concat([df1['date'], df1.value.apply(pd.Series)], 1)

In [586]: df1
Out[586]: 
         date     value      sum
0  2021-09-01    Keyman  8932.20
0  2021-09-01  Suluboya  5896.75
1  2021-10-01   Atelier  5595.30
1  2021-10-01  Atölye4D  3538.73

使用pd.json_normalize

In [587]: df1 = df.explode('value')
In [597]: df1 = pd.concat([df1['date'].reset_index(drop=True), pd.json_normalize(df1['value'])], 1)

In [598]: df1
Out[598]: 
         date     value      sum
0  2021-09-01    Keyman  8932.20
1  2021-09-01  Suluboya  5896.75
2  2021-10-01   Atelier  5595.30
3  2021-10-01  Atölye4D  3538.73

【讨论】:

  • 它有效。谢谢
猜你喜欢
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 2021-04-06
  • 2019-07-17
  • 1970-01-01
  • 2014-10-12
  • 2019-11-15
  • 1970-01-01
相关资源
最近更新 更多