我从一个 API 中获取到以下的 DataFrame:
df = pd.DataFrame({'keys': {0: "[{'contract': 'G'}, {'contract_type': 'C'}, {'strike': '560'}, {'strip': '10/1/2022'}]",
1: "[{'contract': 'G'}, {'contract_type': 'P'}, {'strike': '585'}, {'strip': '10/1/2022'}]",
2: "[{'contract': 'G'}, {'contract_type': 'C'}, {'strike': '580'}, {'strip': '10/1/2022'}]",
3: "[{'contract': 'G'}, {'contract_type': 'C'}, {'strike': '545'}, {'strip': '10/1/2022'}]",
4: "[{'contract': 'G'}, {'contract_type': 'P'}, {'strike': '555'}, {'strip': '10/1/2022'}]"},
'value': {0: 353.3, 1: 25.8, 2: 336.65, 3: 366.05, 4: 20.8}})
>>> df
keys value
0 [{'contract': 'G'}, {'contract_type': 'C'}, {'... 353.30
1 [{'contract': 'G'}, {'contract_type': 'P'}, {'... 25.80
2 [{'contract': 'G'}, {'contract_type': 'C'}, {'... 336.65
3 [{'contract': 'G'}, {'contract_type': 'C'}, {'... 366.05
4 [{'contract': 'G'}, {'contract_type': 'P'}, {'... 20.80
“keys”列的每一行都是一个字符串(不是JSON,因为值用单引号而不是双引号括起来)。例如:
>>> df.at[0, keys]
"[{'contract': 'G'}, {'contract_type': 'C'}, {'strike': '560'}, {'strip': '10/1/2022'}]"
我想将“keys”列转换为DataFrame,并将其附加到df
作为新列。
我目前正在执行以下操作:
- 用双引号替换单引号并传递给
json.loads
,以读取具有以下结构的字典列表:
[{'contract': 'G'}, {'contract_type': 'C'}, {'strike': '560'}, {'strip': '10/1/2022'}]
将字典合并为一个字典,使用字典推导式:
{'contract': 'G', 'contract_type': 'C', 'strike': '560', 'strip': '10/1/2022'}
- 对每一行应用此操作,并在结果上调用
pd.DataFrame
构造函数。 - 与原始的
df
进行join
操作。
我的代码可以写成一行:
>>> df.drop("keys", axis=1).join(pd.DataFrame(df["keys"].apply(lambda x: {k: v for d in json.loads(x.replace("'","\"")) for k, v in d.items()}).tolist()))
value contract contract_type strike strip
0 353.30 G C 560 10/1/2022
1 25.80 G P 585 10/1/2022
2 336.65 G C 580 10/1/2022
3 366.05 G C 545 10/1/2022
4 20.80 G P 555 10/1/2022
我在想是否有更好的方法来做这件事。