2017-08-29 19 views
2

私はCSVをたくさん持っています。列の1つであるExtraParamsにはJSONオブジェクトが含まれています。特定のキーを使用して値を抽出したいのですが、CSVの60.000s何かの行を取得するのにかなり時間がかかります。スピードアップできますか?JSON列からの値の抽出が非常に遅い

counter = 0 #just to see where I'm at 

order_data['NewColumn'] = '' 

for row in range(len(total_data)):   
s = total_data['ExtraParams'][row]  
try:  
    data = json.loads(s) 
    new_data = data['NewColumn'] 

    counter += 1 
    print(counter) 

    order_data['NewColumn'][row] = new_data 
except: 
    print('NewColumn not in row') 

は、私が使用してのtry-除く行の数は、私は、彼らが「区切り期待 『』」エラーでプログラムをクラッシュとして、JSONを台無しにされたと仮定し何を持っているので。

私が「遅い」と言うとき、私は60.000rowsの〜30分を意味します。

EDIT:それぞれのJSONに約35のキーと値のペアが含まれているとは限りません。

+0

のようなラムダ関数を使ってJSONの例を共有できますか? – MedAli

+1

大きなファイルに対してJSONもCSVも作成されません。データをデータベースにインポートし、そこから処理することを検討する必要があります。 JSONをサポートしているDBサーバーを使用することをお勧めします。 –

+0

@KlausD。それはおそらく最高のアイデアだね。私は大規模なデータセットに対してPython/Pandasだけを使って効率的に誰かを見つけることができませんでした。 [This](https://stackoverflow.com/questions/14262433/large-data-work-flows-using-pandas)投稿は解決策を提供するかもしれません。 – Khaine775

答えて

3

pandasのようなものを使用してapplyメソッドを使用できます。 test.CSV

Col1,Col2,ExtraParams 
1,"a",{"dog":10} 
2,"b",{"dog":5} 
3,"c",{"dog":6} 

でいくつかの簡単なサンプルデータのためにあなたはJSONからフィールドを抽出する必要がある場合は、フィールドをと仮定すると、各行に存在しているあなたが書くことができるもの

In [1]: import pandas as pd 

In [2]: import json 

In [3]: df = pd.read_csv("test.csv") 

In [4]: df.ExtraParams.apply(json.loads) 
Out[4]: 
0 {'dog': 10} 
1 {'dog': 5} 
2 {'dog': 6} 
Name: ExtraParams, dtype: object 

などを使用することができます

In [5]: df.ExtraParams.apply(lambda x: json.loads(x)['dog']) 
Out[5]: 
0 10 
1  5 
2  6 
Name: ExtraParams, dtype: int64 
+0

それはJSON全体を右の列にロードしますか?私は基本的にJSONの特定の価値に興味があります。 – Khaine775

+0

はインラインで例として回答しました – mgilbert

関連する問題