Вывернуть уровни колонн наизнанку - PullRequest
3 голосов
/ 09 июля 2020

У меня есть 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 l oop, который проходит через каждую строку один за другим ) способ сделать это в 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},
        },
    ]
)

1 Ответ

1 голос
/ 09 июля 2020

Используйте DataFrame.filter + DataFrame.droplevel и объедините столбцы вдоль axis=1, используя dict, наконец, используйте 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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...