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

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

我的嵌套dict是:

  1. nest_dict = {
  2. 'Main_col1':
  3. {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6},
  4. 'Main_col2':
  5. {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6},
  6. 'Main_col3':
  7. {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6},
  8. 'Main_col4':
  9. {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6},
  10. 'Main_col5':
  11. {'col': 1, 'col2': 2, 'col3': 3, 'sub_col': 4, 'sub_col2': 5, 'sub_col3': 6}
  12. }

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

nwsw7zdq

nwsw7zdq1#

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

  1. tmp = pd.DataFrame.from_dict(nest_dict, orient='index')
  2. tmp2 = tmp.filter(like='sub_')
  3. out = pd.concat({'main': tmp.drop(columns=tmp2.columns),
  4. 'sub': tmp2.rename(columns=lambda c: c.removeprefix('sub_'))
  5. }).swaplevel().sort_index(level=0, sort_remaining=False)

字符串
输出量:

  1. col col2 col3
  2. Main_col1 main 1 2 3
  3. sub 4 5 6
  4. Main_col2 main 1 2 3
  5. sub 4 5 6
  6. Main_col3 main 1 2 3
  7. sub 4 5 6
  8. Main_col4 main 1 2 3
  9. sub 4 5 6
  10. Main_col5 main 1 2 3
  11. sub 4 5 6


或者:

  1. tmp = pd.DataFrame.from_dict(nest_dict, orient='index')
  2. out = (tmp.set_axis(pd.MultiIndex.from_frame(
  3. tmp.columns.str.extract('(?:([^_]+)_)?(.*)')
  4. ),
  5. axis=1)
  6. .stack(level=0)
  7. .rename_axis(index=[None, None], columns=None)
  8. )


输出量:

  1. col col2 col3
  2. Main_col1 NaN 1 2 3
  3. sub 4 5 6
  4. Main_col2 NaN 1 2 3
  5. sub 4 5 6
  6. Main_col3 NaN 1 2 3
  7. sub 4 5 6
  8. Main_col4 NaN 1 2 3
  9. sub 4 5 6
  10. Main_col5 NaN 1 2 3
  11. sub 4 5 6

展开查看全部
sr4lhrrt

sr4lhrrt2#

我会:

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

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

相关问题