2017-08-29 51 views
2

我有一堆数据的CSV。其中一列ExtraParams包含一个JSON对象。我想使用特定的键提取值,但要花费相当长的时间才能通过CSV中的60.000的某些行。它可以加快吗?从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,因为他们有一个“期待分隔符“,”错误程序崩溃。

当我说“慢”时,我的意思是~30分钟为60,000行。

编辑:它可能不值得每个JSON包含大约35个键/值对。

+0

你能分享一个你的JSON的例子吗? – MedAli

+1

JSON和CSV都不适用于大文件。您应该考虑将数据导入数据库并从那里进行处理。使用带有JSON支持的数据库服务器可能是一个好主意。 –

+0

@KlausD。这可能是最好的主意,是的。我一直无法找到有效地完成我打算使用Python /熊猫作为大型数据集的人。 [这](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} 

您可以使用类似

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

但是,将整个JSON加载到列中的权利?我基本上只对JSON的特定值感兴趣。 – Khaine775

+0

内嵌示例 – mgilbert