带有json列的pandas中的Csv

时间:2017-10-06 14:11:11

标签: python json python-3.x pandas

我是Python的新手,但我正在尝试将此csv读入pandas数据帧。从我目前所知,我尝试过使用json_normalize但是我收到了错误。有人可以帮助或给我一个方向,我可以做些什么来获得理想的结果?

d = pd.read_csv('temp.csv')
normd = json_normalize(d['Genre'])

的.csv

Id, Genre
237000000,[ {""id"": 28, ""name"": ""Action""}, 
            {""id"": 12, ""name"": ""Adventure""}, 
            {""id"": 14, ""name"": ""Fantasy""}, 
            {""id"": 878, ""name"": ""Science Fiction""} ] 

结果数据框

Id         GenreId  GenreName
237000000  28       Action
237000000  12       Adventure
237000000  14       Fantasy
237000000  878      Science Fiction

错误

AttributeError                            
Traceback (most recent call last) <ipython-input-62-b221c2f04868> in <module>() 
----> 1 normd = json_normalize(d['Genre'])

C:\ProgramData\Anaconda3\lib\site-packages\pandas\io\json\normalize.py in json_normalize(data, record_path, meta, meta_prefix, record_prefix, errors, sep)
181 
182     if record_path is None:
--> 183         if any([isinstance(x, dict) for x in compat.itervalues(data[0])]):
184             # naive normalization, this is idempotent for flat records
185             # and potentially will inflate the data considerably for

C:\ProgramData\Anaconda3\lib\site-packages\pandas\compat\__init__.py in itervalues(obj, **kw)
182 
183     def itervalues(obj, **kw):
--> 184         return iter(obj.values(**kw))
185 
186     next = next

AttributeError: 'str' object has no attribute 'values'

1 个答案:

答案 0 :(得分:0)

构建第二列的方式使得无法使用逗号作为分隔符引入数据。第二列中包含逗号和换行符。因此,最好的办法是将整个事物作为字符串导入,并通过定位json并将其转换为python数据结构来进行一些清理。使用您发布的csv数据片段,以下内容将数据作为字符串导入,然后用逗号分隔换行符 未跟随 。这基本上意味着构成真正换行符的任何换行符,避免文本json部分中的换行符。完成后,它会继续将结果列表的每个元素拆分为逗号 未跟随 的空格或换行符。同样,这样做是为了避免在文本的json部分内的逗号上拆分。 此时,您有一个列表列表;每个子列表都有2个元素:ID值和json文本。因此,您可以跳过第一个子列表并遍历其余的子列表。在每次迭代中,您都需要将json文本转换为字典的python列表,并循环遍历此字典列表,以使用您希望所需输出包含的内容对其进行编辑。见下图:

import json
import re
import pandas as pd


with open('complex.csv') as f:
    data = []
    text = f.read()
    records = [re.split(",(?![ \n]+)", x.replace('""', '"')) for x in re.split("(?<!, )\n", text)]
    for r in records[1:]:
        second_col = json.loads(r[1])
        for d in second_col:
            d['GenreId'] = d['id']
            d['Id'] = r[0]
            del d['id']
            d['GenreName'] = d['name']
            del d['name']
        data += second_col
    df = pd.DataFrame(data)


print(df)


#    GenreId        GenreName         Id
# 0       28           Action  237000000
# 1       12        Adventure  237000000
# 2       14          Fantasy  237000000
# 3      878  Science Fiction  237000000

complex.csv

的内容
Id, Genre
237000000,[ {""id"": 28, ""name"": ""Action""}, 
            {""id"": 12, ""name"": ""Adventure""}, 
            {""id"": 14, ""name"": ""Fantasy""}, 
            {""id"": 878, ""name"": ""Science Fiction""} ]

我希望这会有所帮助。