Pandas: условная замена значений nan внутри группы

У меня есть фрейм данных с отсутствующими значениями. для каждого индекса в группе столбцов я хочу заменить эти значения отдельно. Если все значения в группе отсутствуют, я хочу заменить значения на 1. Если отсутствуют только некоторые значения, я хочу заменить их данными из вмененного фрейма данных.

фрейм данных 1

индекс д0_1 d0_2 d1_1 d1_2 группа д0 д0 d1 d1 1 3 3 NaN NaN 2 3 NaN 3 3

фрейм данных 2 (вмененный)

индекс д0_1 d0_2 d1_1 d1_2 группа д0 д0 d1 d1 1 3 3 2 2 2 3 2 3 3

выход:

индекс д0_1 d0_2 d1_1 d1_2 группа д0 д0 d1 d1 1 3 3 1 1 2 3 2 3 3

мои данные намного больше, и группы тоже больше.

Я боролся с этим в течение нескольких дней, я просто не могу найти рабочее решение

мое текущее решение перебирает все группы и использует groupby.transform для замены значений, но я не знаю, как сообщить лямбда-функции, чтобы она брала значения из моего второго фрейма данных, и моя текущая лямбда-функция также не заменяет все значения либо с 1, вместо этого просто возвращая старые группы без изменений

df1 = pd.read_csv("file.txt", sep = "\t", index_col = "T: Protein.Group")

def group(a: pd.DataFrame):
    a_grouped = a.groupby(["group"] , axis=1)
    return a_grouped

def getgroup(a: pd.DataFrame):
    new_idx = pd.MultiIndex.from_arrays([
        a.columns,
        a.columns.str.extract("(d\d+)_\d+", expand = False)
    ], names=["index", "group"])
    a.columns = new_idx
    return a

df1grp = group(getgroup(df1))

for i in list(df1grg.groups.keys())
        df1grp.get_group(i).transform(
            lambda x: 1 if x.eq(np.nan).all() else x
        )

Если у вас есть MultiIndex, предоставьте конструкторы DataFrame.

mozway 25.11.2022 15:47

я добавил его в исходный пост. он содержит код из ответа, который вы предоставили 2 дня назад :) Большое спасибо за это, кстати!

Sepp Seppel 25.11.2022 17:32

Смотрите обновленный ответ (изначально я думал, что у df есть простой индекс столбца и первая строка 'group'...) Теперь это намного проще. Вы были на правильном пути, кстати.

Pierre D 25.11.2022 18:48
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
3
51
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

IIUC:

df = df1.mask(df1.groupby('group', axis=1).count() == 0, 1)
df = df.where(~df.isna(), df2)

>>> df
index d0_1 d0_2 d1_1 d1_2
group   d0   d0   d1   d1
1        3    3    1    1
2        3    2    3    3

Это предполагает, что столбцы действительно являются MultiIndex, как вы описываете, например:

>>> df1.columns
MultiIndex([('d0_1', 'd0'),
            ('d0_2', 'd0'),
            ('d1_1', 'd1'),
            ('d1_2', 'd1')],
           names=['index', 'group'])

(Сначала я потратил несколько минут на создание таких столбцов, так как думал, что у вас есть простые индексные столбцы и первая строка с 'group'...)

Другие вопросы по теме