从JSON列中提取值非常慢

时间:2017-08-29 13:02:53

标签: python json pandas

我有一堆带有大量数据的CSV。其中一列ExtraParams包含一个JSON对象。我想使用特定的密钥提取值,但是需要花费很长时间才能通过CSV中的60.000个行。可以加速吗?

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')

我使用了一个尝试 - 除了因为一些行具有我认为混乱的JSON,因为它们使用#34;期望的分隔符''""错误。

当我说"慢"我的意思是〜60分钟的约30分钟。

编辑:每个JSON包含大约35个键/值对可能没什么价值。

1 个答案:

答案 0 :(得分:3)

您可以使用pandas之类的内容并使用apply方法。对于test.csv中的一些简单样本数据

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

您可以使用类似

的内容
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

如果需要从json中提取字段,假设每行中都有字段,则可以编写一个lambda函数,如

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