如何在 Pandas 数据框列内的列表中分解/拆分嵌套列表并从中生成单独的列?

Sha*_*h k 2 nested-lists dataframe python-3.x pandas

我有一个数据框:我想将选项列拆分为 id、AUD、ud。

id col1 col2  Options
1  A    B   [{'id':25,'X': {'AUD': None, 'ud':0}}] 
2  C    D   [{'id':27,'X': {'AUD': None, 'ud':0}}] 
3  E    F   [{'id':28,'X': {'AUD': None, 'ud':0}}] 
4  G    H   [{'id':29,'X': {'AUD': None, 'ud':0}}] 
Run Code Online (Sandbox Code Playgroud)

预期输出数据帧:

id col1 col2 id   Aud   ud
1  A      B   25  None  0
2  C      D   27  None  0
3  E      F   28  None  0
4  G      H   29  None  0
Run Code Online (Sandbox Code Playgroud)

你如何使用 python3.6 和 Pandas 数据框来处理它?

jez*_*ael 6

使用列表理解与json_normalizefor get DataFrames 和 join together by concat,还添加了DataFrame.add_prefix以避免重复的列名:

from pandas.io.json import json_normalize
import ast

L = [json_normalize(x) for x in df.pop('Options')]
#if strings instead dicts
#L = [json_normalize(ast.literal_eval(x)) for x in df.pop('Options')]

df = df.join(pd.concat(L, ignore_index=True, sort=False).add_prefix('opt_'))
print (df)
   id col1 col2  opt_id opt_X.AUD  opt_X.ud
0   1    A    B      25      None         0
1   2    C    D      27      None         0
2   3    E    F      28      None         0
3   4    G    H      29      None         0
Run Code Online (Sandbox Code Playgroud)

另一种提取X嵌套字典值的解决方案:

L = [{k: v for y in ast.literal_eval(x) for k, v in {**y.pop('X'), **y}.items()} 
           for x in df.pop('Options')]

df = df.join(pd.DataFrame(L, index=df.index).add_prefix('opt_'))
print (df)
   id col1 col2 opt_AUD  opt_ud  opt_id
0   1    A    B    None       0      25
1   2    C    D    None       0      27
2   3    E    F    None       0      28
3   4    G    H    None       0      29
Run Code Online (Sandbox Code Playgroud)