Проблема пропущенных значений очень распространена в реальном мире. Например, предположим, что вы пытаетесь получить информацию от компании. Есть поле для адреса компании. Многие люди хотят сохранить свою конфиденциальность и оставляют это поле пустым. Если данные загружаются пандами, эти пустые поля отображаются как отсутствующие значения. 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!