我有一个包含字典式字符串的数据框列。它有两种方式。第一个选项是字符串内的字典,例如'{"d":11,"g":0.8,"r":45}'。第二个选项是这样的:'{d:18, g:0.1, r:75, f:6}'。数据帧有几百万行。我不知道在哪一行出现第一个或第二个选项。
df_initial = a b c kind
0 0.50 bibi 23 '{"d":11,"g":0.8,"r":45}'
1 0.80 cici 140 '{d:18, g:0.1, r:75, f:6}'
2 0.01 didi 320 '{"d":101,"g":0.05,"r":32}'
3 0.12 mimi 3 '{d:41,g:0.26,r:64}'
所需的数据帧
df_final = a b c kind d g r f
0 0.50 bibi 23 '{'d':11, 'g':0.8, 'r':45}' 11 0.80 45 NaN
1 0.80 cici 140 '{d:18, g:0.1, r:75, f:6}' 18 0.10 75 6.0
2 0.01 didi 320 '{'d':101, 'g':0.05, 'r':32}' 101 0.05 32 NaN
3 0.12 mimi 3 '{d:41, g:0.26, r:64}' 41 0.26 64 NaN
因为在样本数据中缺少''
键,如{d:18, g:0.1, r:75, f:6}
对我来说json.loads
和ast.literal_eval
失败,所以使用:
L=[dict(y.split(':') for y in x.strip("'{} ").replace('"','').replace(', ',',').split(','))
for x in df['kind']]
df = df.join(pd.DataFrame(L, index=df.index))
print (df)
a b c kind d g r f
0 0.50 bibi 23 '{"d":11,"g":0.8,"r":45}' 11 0.8 45 NaN
1 0.80 cici 140 '{d:18, g:0.1, r:75, f:6}' 18 0.1 75 6
2 0.01 didi 320 '{"d":101,"g":0.05,"r":32}' 101 0.05 32 NaN
3 0.12 mimi 3 '{d:41,g:0.26,r:64}' 41 0.26 64 NaN
可以是熊猫。json_normalize将kind
(已被json
解析)列转换为数据帧,请记住,字典中可能有许多不同的键。
import json
df = pd.DataFrame([('a', '{"d":11,"g":0.8,"r":45}'),], columns=['a', 'kind'])
In [6]: pd.json_normalize(df['kind'].apply(json.loads))
Out[6]:
d g r
0 11 0.8 45
你可以沿着axis=columns/0
将这个新的数据框连接到org来得到你想要的
In [11]: pd.concat([df, pd.json_normalize(df['kind'].apply(json.loads))], axis='columns')
Out[11]:
a kind d g r
0 a {"d":11,"g":0.8,"r":45} 11 0.8 45