在 pandas 中使用嵌套字典压平列

Moh*_*ahi 1 python pandas

我从 MySQL 数据库获取数据。获取的数据有一列,其中包含嵌套列表和字典。这个 json 与我的数据库中存储的数据类似:

my_dict = {'id': [1, 2, 3],
           'b': [{'100': [{'p': 10, 'max': 20, 'min': 15},
                          {'p': 20, 'max': 30, 'min': 20}]
                 },
                 {'101': [{'p': 100, 'max': 200, 'min': 150}],
                  '102': [{'p': 105, 'max': 205, 'min': 155},
                          {'p': 102, 'max': 202, 'min': 152}]},
                 {'103': [{'p': 210, 'max': 2110, 'min': 1115}]}]}
Run Code Online (Sandbox Code Playgroud)

在代码中,我只有df

df = pd.DataFrame(my_dict)

df   
      id                             b
   0  1   {'100': [{'p': 10, 'max': 20, 'min': 15}, {'p': 20, 'max': 30, 'min': 20}]}
   1  2   {'101': [{'p': 100, 'max': 200, 'min': 150}], '102': [{'p': 105, 'max': 205, 'min': 155}, {'p': 102, 'max': 202, 'min': 152}]}
   2  3      {'103': [{'p': 210, 'max': 2110, 'min': 1115}]}
Run Code Online (Sandbox Code Playgroud)

现在,我想将列展平,b如下所示:

df
      id   key     p     max   min
  0    1    100    10    20    15
  1    1    100    20    30    20
  2    2    101    100   200   150
  3    2    102    105   205   155
  4    2    102    102   202   152
  5    3    103    210   2120  1115
Run Code Online (Sandbox Code Playgroud)

我读到了关于explode和 的内容pd.json_normalize。但他们没有提供帮助。解决这个问题最有效的方法是什么?

moz*_*way 5

使用嵌套列表理解:

pd.DataFrame([{'id': i, 'key': k, 'p': i, **x}
              for i, d in zip(my_dict['id'], my_dict['b'])
              for k, l in d.items() for x in l])
Run Code Online (Sandbox Code Playgroud)

输出:

   id  key    p   max   min
0   1  100   10    20    15
1   1  100   20    30    20
2   2  101  100   200   150
3   2  102  105   205   155
4   2  102  102   202   152
5   3  103  210  2110  1115
Run Code Online (Sandbox Code Playgroud)

  • 如果您已经将 df 作为输入,请使用 zip(df['id'], df['b'])` 代替 zip(my_dict['id'], my_dict['b'])` (2认同)