mee*_*mee 2 python json dataframe pandas
您好,我在 csv 文件中有一个非常大的数据集,我将其读入 panda 数据框。一列包含 json 字符串,我想将其值提取到新列中。下图显示了我的 csv 文件中的几行。
第四列(数据)是需要提取的列。第一级中的密钥(605,254,834,265 等)始终在变化,但数字始终与最后一列(“reg”)中的数字相同。我想提取“价格”、“状态”和“#结果”的值并将它们放入新列中。
我正在使用的代码是
import pandas as pd
import numpy as np
import json
from pandas import DataFrame
df = pd.read_csv('sample.csv')
df["result"]=np.nan #create empty column
df["price"]=np.nan
df["status"]=np.nan
for i in range (0,len(df['data'])):
df['result'].iloc[i]=json.loads(df['data'].iloc[i])[str(df['reg'].iloc[i])]['#result']
df['price'].iloc[i]=json.loads(df['data'].iloc[i])[str(df['reg'].iloc[i])]['price']
df['status'].iloc[i]=json.loads(df['data'].iloc[i])[str(df['reg'].iloc[i])]['status']
print(df)
Run Code Online (Sandbox Code Playgroud)
所以我得到了带有新列(结果、价格和状态)的数据框,如下所示:
该代码给了我我想要的输出。然而,由于我使用“for 循环”,因此运行大数据框需要很长时间。我认为必须有一种更聪明的方法来做到这一点。我知道如果第一级密钥是恒定的,则有不同的方法可以做到。任何人都可以有更好的想法在 panda 框架中提取这种类型的 json 字符串。干杯!
在您的示例中,您多次解析相同的 JSON。只需解析一次就足够了。例如:
import pandas as pd
d1 = '{"605":{"price":"570", "address":"946", "status": "done", "#result":"good" }}'
d2 = '{"254":{"price":"670", "address":"300", "status": "done", "classification_id": "102312321", "#result":"good" }}'
df = pd.DataFrame({'num': [1771, 905],
'item': ['orange', 'mango'],
'id': [190384, 2500003],
'data':[d1, d2],
'reg': [605, 254]
})
import json
df = df.join( pd.DataFrame(list(json.loads(d).values())[0] for d in df.pop('data')) )
# drop columns we don't want
del df['address']
del df['classification_id']
print(df)
Run Code Online (Sandbox Code Playgroud)
印刷:
import pandas as pd
d1 = '{"605":{"price":"570", "address":"946", "status": "done", "#result":"good" }}'
d2 = '{"254":{"price":"670", "address":"300", "status": "done", "classification_id": "102312321", "#result":"good" }}'
df = pd.DataFrame({'num': [1771, 905],
'item': ['orange', 'mango'],
'id': [190384, 2500003],
'data':[d1, d2],
'reg': [605, 254]
})
import json
df = df.join( pd.DataFrame(list(json.loads(d).values())[0] for d in df.pop('data')) )
# drop columns we don't want
del df['address']
del df['classification_id']
print(df)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8443 次 |
| 最近记录: |