python - 将列级别由内而外

标签 python pandas dataframe reshape data-wrangling

我有一个看起来像这样的 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_1foo_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},
        },
    ]
)

最佳答案

使用DataFrame.filter + DataFrame.droplevel并使用 dict 聚合沿 axis=1 的列,最后使用 DataFrame.drop删除 MultiLevel 列:

df['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_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 - 将列级别由内而外,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62818462/

相关文章:

python - 刷新数据库双端队列

python - 在容器中使用时,MLFlow 无法将我的工件正确复制到 mlruns 文件夹

python - 使用 groupby/aggregate 返回多列

python - pandas 列的数据类型在通过应用传递给函数时更改为对象?

Python - 如何使用 python pandas crosstab 创建混淆矩阵统计

r - 根据 R 中另一个 df 中的一行中的多个值有条件地填充一个 df 中的列的更好方法

r - 将加权随机变量分配给 R 数据框中的新列

python - 如何将主键传递给 url 以编辑有关对象的信息?

python - django 简单评级,查询太多

python - 链接分组、过滤和聚合