python - 当 json_normalize 无法迭代列以展平时如何修复它?

标签 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' object has no attribute '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}]}

最佳答案

将列表理解与扁平化和添加新元素 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

关于python - 当 json_normalize 无法迭代列以展平时如何修复它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51153854/

相关文章:

python - 使用 MinuteLocator 为 pandas.DataFrame.plot 每分钟设置一次滴答给出 "OverflowError: int too big to convert"

java - Spring Controller 向来自 AngularJS 应用程序的请求返回 415

python - C++特征库中的argmax()方法

python - 如何解析 CSS URL 中的特定值

python - 将整个 csv 转换为 json 文件- python

android - 如何从 URL 读取 BIG JSON 内容

java - 使用带有动态字段的 Jackson 注释反序列化 JSON

python - 在 Python 中使用季节性分解时我做错了什么?

python - 使用pandas将txt文件处理为csv

python - 在基于类的 View 中将当前登录的用户名作为参数传递给reverse_lazy