我有一個資料框,其列如下所示:
df=pd.DataFrame()
df['symbol'] = ['A','B','C']
df['json_list'] = ['[{name:S&P500, perc:25, ticker:SPY, weight:1}]',
'[{name:S&P500, perc:25, ticker:SPY, weight:0.5}, {name:NASDAQ, perc:26, ticker:NASDAQ, weight:0.5}]',
'[{name:S&P500, perc:25, ticker:SPY, weight:1}]']
df['date'] = ['2022-01-01', '2022-01-02', '2022-01-02']
df:
symbol json_list date
0 A [{name:S&P500, perc:25, ticker:SPY, weight:1}] 2022-01-01
1 B [{name:S&P500, perc:25, ticker:SPY, weight:0.5... 2022-01-02
2 C [{name:S&P500, perc:25, ticker:SPY, weight:1}] 2022-01-02
json_list列中的值為<class 'str'>。
如何將json_list列項轉換為字典,以便我可以基于鍵:值對訪問它們?
先感謝您。
uj5u.com熱心網友回復:
更新以反映問題中的 json 字串不是單例串列,但可以包含多個類似 dict 的元素的事實。
這會將物件放在資料框list的dict新列中:
def foo(x):
src = x['json_list']
rawList = src[1:-1].split('{')[1:]
rawDictList = [x.split('}')[0] for x in rawList]
dictList = [dict(x.strip().split(':') for x in y.split(',')) for y in rawDictList]
for dct in dictList:
for k in dct:
try:
dct[k] = int(dct[k])
except ValueError:
try:
dct[k] = float(dct[k])
except ValueError:
pass
return dictList
df['list_of_dict_object'] = df.apply(foo, axis = 1)
原答案:
這會將 a 放入dict資料框的新列中,該列應為您提供接近所需內容的內容,但數字輸入除外:
df['dict_object'] = df.apply(lambda x: dict(x.strip().split(':') for x in x['json_list'][2:-2].split(',')), axis = 1)
要獲取可轉換字串值的 float 或 int,您可以執行以下操作:
def foo(x):
d = dict(x.strip().split(':') for x in x['json_list'][2:-2].split(','))
for k in d:
try:
d[k] = int(d[k])
except ValueError:
try:
d[k] = float(d[k])
except ValueError:
pass
return d
df['dict_object'] = df.apply(foo, axis = 1)
uj5u.com熱心網友回復:
“json”幾乎是有效的 yaml。如果在冒號后面加空格,可以使用pyyaml決議。
df.json_list.apply(lambda data: yaml.safe_load(data.replace(':', ': ')))
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/479609.html
上一篇:自定義將結構解組為切片映射
