Заполнить NaN в столбце, по данным из другого, если те не входят в определенный список?

Рейтинг: 1Ответов: 1Опубликовано: 31.05.2023

Датафрейм:

name year_of_release platform
Rayman Arena 2001.0 PS2
Rayman Arena 2002.0 GBA
Rayman Arena NaN GC
Madden NFL 2004 2003.0 XB
Madden NFL 2004 NaN GBA
Madden NFL 2004 NaN PS2

Я хочу заполнить NaN в колонке year_of_release, годом такого же названия игры, но расположенной на другой платформе. Есть проблема, что у идентичных наименований может быть разный год релиза - в таком случае оставить NaN.

Я решила сначала создать список, где отфильтровала идентичные наименования с разными годами релиза, после с помощью apply пыталась заполнить NaN в колонке year_of_release, исключая строки в которых наименование попадает в список. Всё что не имеет идентичных наименований и одинаковый год релиза я решила оставить как NaN. Заполнять решила средним, потому что если выбирать медиану, то название, где больше NaN становятся NaN. На данный момент названия не фильтруются по созданному списку.

создание списка в которые входят идентичные наименования с разным годом релиза:

excludae_list = df.groupby('name')['year_of_release'].agg(['min', 'max']).reset_index()
excludae_list = excludae_list[excludae_list['min'] != excludae_list['max']]
excludae_list = excludae_list['name']

заполнение пропусков в колонке year_of_release:

df['year_of_release'] = df.groupby('name')['year_of_release'].apply(lambda x: x.fillna(np.mean(x)) if x.name not in exclude_list else np.nan)

Ответы

▲ 3Принят

Если я правильно понял вопрос, то решить можно просто таким орбазом:

df["year_of_release"] = df.groupby("name", group_keys=False)["year_of_release"].apply(
    lambda x: x.fillna(x.dropna().unique()[0] if x.nunique()==1 else np.nan))
              name  year_of_release platform
0     Rayman Arena           2001.0      PS2
1     Rayman Arena           2002.0      GBA
2     Rayman Arena              NaN       GC
3  Madden NFL 2004           2003.0       XB
4  Madden NFL 2004           2003.0      GBA
5  Madden NFL 2004           2003.0      PS2