Проблема пропущенных значений очень распространена в реальном мире. Например, предположим, что вы пытаетесь получить информацию от компании. Есть поле для адреса компании. Многие люди хотят сохранить свою конфиденциальность и оставляют это поле пустым. Если данные загружаются пандами, эти пустые поля отображаются как отсутствующие значения. NaN
— это отсутствующее значение по умолчанию в pandas. В этой статье давайте посмотрим, как мы можем справиться с ними.
Общие операции с NaN
данными
- Когда
mean
/sum
/std
/median
выполняются для серии, которая содержит пропущенные значения, эти значения будут рассматриваться как нулевые. - При выполнении
add
/div
/sub
результатом будетNaN
. - Если все данные равны
NaN
, результатsum()
равен нулю.
pd.Series([np.nan]).sum() #result is zer
import pandas as pd s = pd.Series([1, 2, None, 4]) print(s) s1 = pd.Series([2, 3, 5, 6]) # The third value is NA print(s + s1) # sum a series only contains NaN s2 = pd.Series([None, None]) print(s2.sum())
line 3
показывает сумму объекта Series, который содержит один элемент NaN
. line 7
показывает добавление двух объектов Series, один из которых содержит элемент NaN
. line 11
показывает результат суммирования серии, которая содержит только NaN
.
Групповые операции над NaN
Как упоминалось выше, NaN
будет рассматриваться как ноль в большинстве операций. Однако в groupby
NaN
автоматически исключается.
import pandas as pd data = {“key”: [“K0”, “K0”, “K0”, None, None], “val”: [1, 2, 3, 4, 5]} group = pd.DataFrame(data).groupby(“key”).mean() print(group)
Функциональные операции над значениями NaN
isnull
функция
Чтобы проверить, являются ли данные NA, isnull()
возвращает DataFrame логического значения того же размера. Когда значение равно NaN
, соответствующая позиция имеет значение True, в противном случае — значение False.
import pandas as pd s = pd.Series([1, 2, None, 4]) print(“The original series object.”) print(s) print(“The result after calling isnull”) print(s.isnull())
Как видно из вывода isnull()
, это объект Series с логическим значением той же длины, что и исходный объект.
функция заполнения
pandas предоставляет очень полезную функцию для заполнения пропущенных значений, fillna()
В обычном случае fillna()
достаточно, чтобы решить проблему, просто передав статическое описываемое значение.
improt pandas as pd
s = pd.Series([1, 2, None, 4])
s.fillna(6)
Однако, когда вы имеете дело с данными временных рядов, очень часто отсутствующее значение заполняется последним неотсутствующим значением.
fillna(method='ffill')
заполняет пропущенное значение из следующего значения.fillna(method='bfill')
заполняет отсутствующее значение из последнего значения или последнего неотсутствующего значения.ffill
эквивалентноfillna(method='ffill')
.bfill
эквивалентноfillna(method='bfill')
.
import pandas as pd s = pd.Series([1,2,None,None,5,6]) print(“The original value”) print(s.values) print(“Fill the value by forward method”) print(“The None value is filled by the last seen value \”2\””) s1 = s.fillna(method=”ffill”) print(s1.values)
В этом примере мы заполняем эти значения NaN
последним увиденным значением, 2
.
Удалить NaN
данные
Наиболее часто используемая функция для данных NaN. Чтобы удалить значения NaN
из DataFrame, мы используем функцию dropna()
. Эта функция удаляет строки/столбцы данных, которые имеют NaN
значений.
dropna()
— удалить строки хотя бы с одним значениемNaN
.dropna(how = 'all')
— удалить строки, в которых все значения равныNaN
.dropna(axis = 1)
— удалить столбцы хотя бы с одним значениемNaN
.
import pandas as pd d = { "a": [1, 2, 3, None], "b": [1, None, 3, None], "c": [1, 2, 3, None], "d": [1, 2, 3, None] } df = pd.DataFrame(d) print("The original DataFrame") print(df) print("-----------------------------") df1 = df.dropna() print("Rows with index 1 and 3 are dropped.") print(df1) print("-----------------------------") print("Rows with index 3 are dropped, whose values are all NA") df2 = df.dropna(how='all') print(df2) print("-----------------------------") df['e'] = df['a'].fillna(1) + 1 print("Column a b c d are dropped") df3 = df.dropna(axis=1) print(df3)
line 13
показано, как удалить строки, содержащие хотя бы один элемент NaN
.
line 19
показывает, как удалить строки, все элементы которых равны NaN
.
line 25
показано, как удалить столбцы хотя бы с одним элементом NaN
.
Нулевые значения распространены в сценариях реального мира. Обработка нулевых значений поможет нам оптимизировать производительность при выполнении тяжелых операций и сделает фрейм данных более надежным. До следующего раза, Adios!