pandas 将嵌套的dict转换为带子列的dataframe

wrrgggsh  于 2023-08-01  发布在  其他
关注(0)|答案(2)|浏览(109)

我的嵌套dict是:

nest_dict = {
'Main_col1': 
  {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6}, 
'Main_col2': 
  {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6}, 
'Main_col3': 
  {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6}, 
'Main_col4': 
  {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6}, 
'Main_col5': 
  {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6}
}

字符串
我想从上面嵌套的dict中创建dataframe,这样我的sub_columns将在Main_cols之上,cols将与sub_cols处于同一级别,但没有main_cols。
我试过pd.DataFrame.from_dict, pd.MultiIndex, pd.Dataframe和xlwings转换。没有什么能让我像预期的那样输出。谢谢你的帮助!

nwsw7zdq

nwsw7zdq1#

预期的输出不清楚,是否要交错行?

tmp = pd.DataFrame.from_dict(nest_dict, orient='index')
tmp2 = tmp.filter(like='sub_')

out = pd.concat({'main': tmp.drop(columns=tmp2.columns),
                 'sub': tmp2.rename(columns=lambda c: c.removeprefix('sub_'))
                 }).swaplevel().sort_index(level=0, sort_remaining=False)

字符串
输出量:

col  col2  col3
Main_col1 main    1     2     3
          sub     4     5     6
Main_col2 main    1     2     3
          sub     4     5     6
Main_col3 main    1     2     3
          sub     4     5     6
Main_col4 main    1     2     3
          sub     4     5     6
Main_col5 main    1     2     3
          sub     4     5     6


或者:

tmp = pd.DataFrame.from_dict(nest_dict, orient='index')

out = (tmp.set_axis(pd.MultiIndex.from_frame(
                       tmp.columns.str.extract('(?:([^_]+)_)?(.*)')
                                             ),
                    axis=1)
          .stack(level=0)
          .rename_axis(index=[None, None], columns=None)
      )


输出量:

col  col2  col3
Main_col1 NaN    1     2     3
          sub    4     5     6
Main_col2 NaN    1     2     3
          sub    4     5     6
Main_col3 NaN    1     2     3
          sub    4     5     6
Main_col4 NaN    1     2     3
          sub    4     5     6
Main_col5 NaN    1     2     3
          sub    4     5     6

sr4lhrrt

sr4lhrrt2#

我会:

Main_col1                 Main_col2 
col1  col2  col3  sub_col1  sub_col2  sub_col3  sub_col1  sub_col2  sub_col3
   1     2     3         4         5         6         4         5         6 
   1     2     3         4         5         6         4         5         6

字符串
所有Main_cols只有3个sub_cols。假设cols和sub_cols的每个值都是相同的,但不是这样,但这不是必须的。在大多数情况下,cols值是Series。

相关问题