Заполнить NaN в столбце, по данным из другого, если те не входят в определенный список?
Датафрейм:
| 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)
Ответы (1 шт):
Если я правильно понял вопрос, то решить можно просто таким орбазом:
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