Pandas:如何将列的字典映射为单独的列名及其对应的值

Pandas:如何将列的字典映射为单独的列名及其对应的值,pandas,dictionary,pandas-groupby,Pandas,Dictionary,Pandas Groupby,我有一个以下格式的数据框 ip_df=pd.DataFrame({'class':['I','II','III'],'details':[{'sec':'A','kinder':'yes'},{'sec':'B'}] ip_df: class details 0 I {'sec':'A','kinder':'yes'} 1 II {'sec':'B'} 2 III None 如何将字典键作为列名和字典值映射到其各自的“details”列 如

我有一个以下格式的数据框

ip_df=pd.DataFrame({'class':['I','II','III'],'details':[{'sec':'A','kinder':'yes'},{'sec':'B'}]
ip_df:
    class   details
0   I       {'sec':'A','kinder':'yes'}
1   II      {'sec':'B'}
2   III     None
如何将字典键作为列名和字典值映射到其各自的“details”列


如果性能不重要,则将每行转换为
系列

ip_df = ip_df.join(ip_df['details'].apply(pd.Series))
print (ip_df)
  class                        details  sec kinder
0     I  {'sec': 'A', 'kinder': 'yes'}    A    yes
1    II                   {'sec': 'B'}    B    NaN
2   III                           None  NaN    NaN
另一种解决方案是通过构造函数删除缺少的值或
None
s并创建
DataFrame

s = ip_df['details'].dropna()
ip_df = ip_df.join(pd.DataFrame(s.tolist(), index=s.index))
print (ip_df)
  class                        details  sec kinder
0     I  {'sec': 'A', 'kinder': 'yes'}    A    yes
1    II                   {'sec': 'B'}    B    NaN
2   III                           None  NaN    NaN
最后,如有必要,将缺少的值转换为
None
s:

ip_df = ip_df.mask(ip_df.isna(), None)
print (ip_df)
  class                        details   sec kinder
0     I  {'sec': 'A', 'kinder': 'yes'}     A    yes
1    II                   {'sec': 'B'}     B   None
2   III                           None  None   None
ip_df = ip_df.mask(ip_df.isna(), None)
print (ip_df)
  class                        details   sec kinder
0     I  {'sec': 'A', 'kinder': 'yes'}     A    yes
1    II                   {'sec': 'B'}     B   None
2   III                           None  None   None