创建新列并将值添加到数据框的单元格,来自像列这样的字符串字典

create new column and add values to cells of dataframe, from string dictionary like column

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

您可以 pandas.json_normalizekind(已 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 将这个新数据框连接到组织中以获得您想要的内容

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

因为示例数据中缺少 '' 键,例如 {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