将 panda 列中的 json 字符串值提取到第一级中具有动态键的新列中

mee*_*mee 2 python json dataframe pandas

您好,我在 csv 文件中有一个非常大的数据集,我将其读入 panda 数据框。一列包含 json 字符串,我想将其值提取到新列中。下图显示了我的 csv 文件中的几行。

这是我的 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 字符串。干杯!

And*_*ely 6

在您的示例中,您多次解析相同的 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)