我是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'
答案 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""} ]
我希望这会有所帮助。