У меня есть фрейм данных с отсутствующими значениями. для каждого индекса в группе столбцов я хочу заменить эти значения отдельно. Если все значения в группе отсутствуют, я хочу заменить значения на 1. Если отсутствуют только некоторые значения, я хочу заменить их данными из вмененного фрейма данных.
фрейм данных 1
фрейм данных 2 (вмененный)
выход:
мои данные намного больше, и группы тоже больше.
Я боролся с этим в течение нескольких дней, я просто не могу найти рабочее решение
мое текущее решение перебирает все группы и использует 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
)
я добавил его в исходный пост. он содержит код из ответа, который вы предоставили 2 дня назад :) Большое спасибо за это, кстати!
Смотрите обновленный ответ (изначально я думал, что у df
есть простой индекс столбца и первая строка 'group'
...) Теперь это намного проще. Вы были на правильном пути, кстати.
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'
...)
Если у вас есть MultiIndex, предоставьте конструкторы DataFrame.