解析一列JSON字符串

时间:2017-09-12 11:35:14

标签: python json performance pandas dataframe

我有一个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

有关更快方法的任何建议吗?

1 个答案:

答案 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