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.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)
使用注
'vectorize'はただのループを隠しませんか? – James
@Jamesそれは隠して、それをスピードアップします。あなたはこれを見る必要があります:https://stackoverflow.com/a/46163829/4909087また、try-exceptアプローチは高速です(条件、EAFPなどより速いので) 。 –
興味深いことに、スピードアップは、放送の基礎となる数字の配列に来ていますか? – James