2017-09-12 9 views
0

私はタブで区切られたフラットファイルを持っています。その1列はJSONデータが文字列として格納されています。私が何をしたいか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 
... 

はパンダのデータフレームとしてテーブルをロードし、COL3のための型キーからの情報だけでデータを文字列に変更しています。タイプキーのないJSONまたはJSONがない場合は、返す必要はありません。

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 

より迅速なアプローチについてのご意見はありますか?あなたが誤ってあなたに意味するものではありませんでしたエラーをキャッチし、ドロップすることができますよう、裸exceptを使用することが推奨されることはありませんことをnp.vectorizejson.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) 

使用注

答えて

2


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 
+0

'vectorize'はただのループを隠しませんか? – James

+0

@Jamesそれは隠して、それをスピードアップします。あなたはこれを見る必要があります:https://stackoverflow.com/a/46163829/4909087また、try-exceptアプローチは高速です(条件、EAFPなどより速いので) 。 –

+0

興味深いことに、スピードアップは、放送の基礎となる数字の配列に来ていますか? – James