如何在无法遍历要展平的列时修复json_normalize?

时间:2018-07-03 11:47:38

标签: python json pandas

我有一个看起来像这样的数据框:

ID       phone_numbers
1        [{u'updated_at': u'2017-12-02 15:29:54', u'created_at': u'2017-12-0 
          2 15:29:54', u'sms': 0, u'number': u'1112223333', u'consumer_id': 
          12345, u'organization_id': 1, u'active': 1, u'deleted_at': 
           None, u'type': u'default', u'id': 1234}]

我想获取phone_numbers列并将其内部的信息弄平,因此我可以查询“ id”字段。

当我尝试时;

json_normalize(df.phone_numbers)

我收到错误消息:

  

AttributeError:'str'对象没有属性'itervalues'

我不确定为什么会产生此错误,为什么我不能使此列变平。

编辑:

最初从响应对象(r.text)读取JSON字符串:

https://docs.google.com/document/d/1Iq4PMcGXWx6O48sWqqYnZjG6UMSZoXfmN1WadQLkWYM/edit?usp=sharing

编辑:

通过此命令转换了我需要平整为JSON的列

a = df.phone_numbers.to_json()

{"0":[{"updated_at":"2018-04-12 12:24:04","created_at":"2018-04-12 12:24:04","sms":0,"number":"","consumer_id":123,"org_id":123,"active":1,"deleted_at":null,"type":"default","id":123}]}

4 个答案:

答案 0 :(得分:3)

结合使用列表理解和拼合,并将新元素ID添加到字典中:

df = pd.DataFrame({'ID': [1, 2], 'phone_numbers': [[{'a': '2017', 'b': '2017', 'sms': 1}, 
                                                    {'a': '2018', 'b': '2017', 'sms': 2}], 
                                                  [{'a': '2017', 'b': '2017', 'sms': 3}]]})
print (df)
   ID                                      phone_numbers
0   1  [{'a': '2017', 'b': '2017', 'sms': 1}, {'a': '...
1   2             [{'a': '2017', 'b': '2017', 'sms': 3}]

df = pd.DataFrame([dict(y, ID=i) for i, x in df.values.tolist() for y in x])
print (df)  

   ID     a     b  sms
0   1  2017  2017    1
1   1  2018  2017    2
2   2  2017  2017    3

编辑:

df = pd.DataFrame({'phone_numbers':{"0":[{"type":"default","id":123}]}})

df = pd.DataFrame([y for x in df['phone_numbers'].values.tolist() for y in x])
print (df) 
    id     type
0  123  default

答案 1 :(得分:2)

我不确定,但是我认为json规范化期望将json(而不是pd.series)作为第一个参数,首先将系列转换为dict或dict列表。您可以使用to_dict()

json_normalize(df.phone_numbers.to_dict())

答案 2 :(得分:0)

团队:

我想我找到了答案。如果你挖;您会看到在第一次迭代后pd.json_normalize的输出是STRING。我成功地欺骗了大熊猫,使他们以为这是词典的清单。

fb_customers = test_schema_a["FBCustomers"].to_list()
fb_customers_b = list(itertools.chain(*fb_customers))
test_schema_b = pd.DataFrame(fb_customers_b)

答案 3 :(得分:0)

对我来说最简单的解决方案是首先使用内置的 json 包加载文件,然后将该对象与 normalize 一起使用:

从字符串中读取:

import json
json_str = '{ "name":"John", "age":30, "city":"New York"}'
data = json.loads(json_str)
df = json_normalize(data)
print(df)

并从文件中读取:

import json
                
with open(filepath, 'r') as file:
    data = json.load(file)
    df = json_normalize(data)
    print(df)