创建新的列,并添加值到数据框的单元格,从字符串字典像列



我有一个包含字典式字符串的数据框列。它有两种方式。第一个选项是字符串内的字典,例如'{"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.loadsast.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

最新更新