2将列级别由内而外

我有一个看起来像这样的 pandas DataFrame(创建它的代码在问题的底部):


  col_1 col_2 foo_1       foo_2      

              col_3 col_4 col_3 col_4

0     1     4     2     8     5     7

1     3     1     6     3     8     9

我想将foo_1和foo_2列“由内而外”,即我的预期输出是:


   col_1  col_2                     col_3                     col_4

0      1      4  {'foo_1': 2, 'foo_2': 5}  {'foo_1': 8, 'foo_2': 7}

1      3      1  {'foo_1': 6, 'foo_2': 8}  {'foo_1': 3, 'foo_2': 9}

是否有一种有效的方法(即不涉及编写逐行遍历每一行的 python 循环)在 pandas 中执行此操作?


生成起始 DataFrame 的代码:


import pandas as pd


cols = pd.MultiIndex.from_tuples(

    [

        ("col_1", ""),

        ("col_2", ""),

        ("foo_1", "col_3"),

        ("foo_1", "col_4"),

        ("foo_2", "col_3"),

        ("foo_2", "col_4"),

    ]

)

df = pd.DataFrame([[1, 4, 2, 8, 5, 7], [3, 1, 6, 3, 8, 9]], columns=cols)

生成预期输出的代码:


pd.DataFrame(

    [

        {

            "col_1": 1,

            "col_2": 4,

            "col_3": {"foo_1": 2, "foo_2": 5},

            "col_4": {"foo_1": 8, "foo_2": 7},

        },

        {

            "col_1": 3,

            "col_2": 1,

            "col_3": {"foo_1": 6, "foo_2": 8},

            "col_4": {"foo_1": 3, "foo_2": 9},

        },

    ]

)


守着星空守着你
浏览 85回答 1
1回答

qq_遁去的一_1

使用DataFrame.filter+并使用DataFrame.droplevel聚合列,最后使用删除列:axis=1dictDataFrame.dropMultiLeveldf['col_3'] = df.filter(like='col_3').droplevel(1, 1).agg(dict, axis=1)df['col_4'] = df.filter(like='col_4').droplevel(1, 1).agg(dict, axis=1)df = df.drop(['foo_1', 'foo_2'], 1).droplevel(1, 1)结果:# print(df)  col_1 col_2                     col_3                     col_40     1     4  {'foo_1': 2, 'foo_2': 5}  {'foo_1': 8, 'foo_2': 7}1     3     1  {'foo_1': 6, 'foo_2': 8}  {'foo_1': 3, 'foo_2': 9}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python