Запрос ss = df.query('@x in name and year_of_release == @n').index возвращает пустой фрейм
RangeIndex: 16715 entries, 0 to 16714
Data columns (total 11 columns):
name 16713 non-null object
platform 16715 non-null object
year_of_release 16446 non-null float64
genre 16713 non-null object
na_sales 16715 non-null float64
eu_sales 16715 non-null float64
jp_sales 16715 non-null float64
other_sales 16715 non-null float64
critic_score 8137 non-null float64
user_score 10014 non-null object
rating 9949 non-null object
dtypes: float64(6), object(5)
memory usage: 1.4+ MB
None
Хочу подставить год в year_of_release, если в нем NaN и в name входит год.
Пишу цикл:
n = np.nan
for year in range(2000, 2018):
x = str(year)
ss = df.query('@x in name and year_of_release == @n').index
df.loc[ss, 'year_of_release'] = year - 1
Запрос ss выдает пустой список индексов. Хотя доподлинно известно, есть в названиях года и в тех же строках есть значения NaN столбце годов.
Например, вот такая строка:
name platform year_of_release
Madden NFL 2004 PS2 NaN
Ответы (2 шт):
Автор решения: MaxU
→ Ссылка
"Прелесть" NaN в том, что он не равен самому себе, поэтому сравнение column == NaN не сработает:
In [73]: np.nan == np.nan
Out[73]: False
Но этим же фактом можно воспользоваться себе на пользу, т.к. единственной причиной когда значение в столбце не равно самому себе это когда это значение NaN:
ss = df.query('@x in name and year_of_release != year_of_release').index
# --------------------------> ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Т.е.
df.query('year_of_release != year_of_release')
эквивалентно следующему условию в SQL:
WHERE year_of_release IS NULL
Автор решения: MaxU
→ Ссылка
Еще один вариант:
In [36]: df
Out[36]:
name platform year_of_release
0 Madden NFL 2004 PS2 NaN
1 NFL PS2 2017.0
In [37]: res = df.loc[df["name"].str.contains("NFL") & df["year_of_release"].isna()].index
In [38]: res
Out[38]: Int64Index([0], dtype='int64')