我有一个tab分隔的flatfile,其中一列是以字符串形式存储的JSON数据,例如
Col1 Col2 Col3
1491109818 2017-08-02 00:00:09.250 {"type":"Tipper"}
1491110071 2017-08-02 00:00:19.283 {"type":"HGV"}
1491110798 2017-08-02 00:00:39.283 {"type":"Tipper"}
1491110798 2017-08-02 00:00:39.283 \N
...
我想要做的是将表加载为pandas数据帧,对于col3,将数据更改为仅包含类型键信息的字符串。如果没有JSON或没有类型键的JSON,我想返回None。
e.g。
Col1 Col2 Col3
1491109818 2017-08-02 00:00:09.250 Tipper
1491110071 2017-08-02 00:00:19.283 HGV
1491110798 2017-08-02 00:00:39.283 Tipper
1491110798 2017-08-02 00:00:39.283 None
...
我能想到的唯一方法是使用iterrows,但是在处理大文件时这很慢。
for index, row in df.iterrows():
try:
df.loc[index, 'Col3'] = json.loads(row['Col3'])['type']
except:
df.loc[index, 'Col3'] = None
有关更快方法的任何建议吗?
答案 0 :(得分:2)
使用 np.vectorize
和 json.loads
import json
def foo(x):
try:
return json.loads(x)['type']
except (ValueError, KeyError):
return None
v = np.vectorize(foo)
df.Col3 = v(df.Col3)
请注意,绝不建议使用裸except
,因为您可能会无意中发现并删除您并不意味着的错误。
df
Col1 Col2 Col3
0 1491109818 2017-08-02 00:00:09.250 Tipper
1 1491110071 2017-08-02 00:00:19.283 HGV
2 1491110798 2017-08-02 00:00:39.283 Tipper
3 1491110798 2017-08-02 00:00:39.283 None