Что происходит при удалении значений NaN из столбца? - PullRequest
0 голосов
/ 11 июля 2020

В Pandas, после удаления значений NaN из столбца, какое значение сохраняется в индексе, из которого было удалено значение NaN? Мне удалось успешно удалить значения NaN из столбца, но форма df осталась неизменной, но размер этого конкретного столбца изменился.

1445    70.0
**1446     NaN**
1447    80.0
1448    70.0
1449    21.0
1450    60.0
1451    78.0
1452    35.0
1453    90.0
1454    62.0
1455    62.0
1456    85.0
1457    66.0
1458    68.0
1459    75.0
Name: LotFrontage, dtype: float64
Size of LotFrontage before removing NaN values: 1460

Это то, что я получаю после удаления значений NaN

1444    63.0
1445    70.0
1447    80.0
1448    70.0
1449    21.0
1450    60.0
1451    78.0
1452    35.0
1453    90.0
1454    62.0
1455    62.0
1456    85.0
1457    66.0
1458    68.0
1459    75.0
Name: LotFrontage, dtype: float64
New size of LotFrontage after removing NaN values: 1201

Я получаю следующую ошибку при попытке выделить значение индекса 1446:

[введите описание изображения здесь] [1]

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
<ipython-input-70-7cb9d14fb3e0> in <module>()
      3 print("New size of LotFrontage after revoving NaN values: " + str(iowa['LotFrontage'].size))
      4 print(iowa['LotFrontage'][1445])
----> 5 print(iowa['LotFrontage'][1446])

1 frames
/usr/local/lib/python3.6/dist-packages/pandas/core/indexes/base.py in get_value(self, series, key)
   4403         k = self._convert_scalar_indexer(k, kind="getitem")
   4404         try:
-> 4405             return self._engine.get_value(s, k, tz=getattr(series.dtype, "tz", None))
   4406         except KeyError as e1:
   4407             if len(self) > 0 and (self.holds_integer() or self.is_boolean()):

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_value()

pandas/_libs/index.pyx in pandas._libs.index.IndexEngine.get_loc()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

pandas/_libs/hashtable_class_helper.pxi in pandas._libs.hashtable.Int64HashTable.get_item()

KeyError: 1446

Ответы [ 2 ]

0 голосов
/ 11 июля 2020

Я предполагаю, что вы, должно быть, использовали функцию dropna для удаления значений NaN. Вы можете сбрасывать разными способами, используя функцию dropna. По умолчанию он отбрасывает строку и отбрасывает строку, если какой-либо столбец в этой строке имеет значение NaN. Вы можете изменить это поведение, установив различные параметры, например здесь .

И когда строка будет удалена, форма обязательно изменится. В вашем случае форма не должна измениться, потому что вы «не упали на место». Без установки для inplace значения True, функция dropna вернет вам отброшенный фрейм данных, а не изменит его в исходном фрейме данных.

Если отбрасывание индекса является желательным поведением, используйте dropna одним из способов:

df_final = df.dropna()
or
df.dropna(inplace=True)

Если у вас есть несколько столбцов в фрейме данных и вы хотите удалить строку только тогда, когда все столбцы имеют NaN, используйте:

df_final = df.dropna(how='all')
or
df.dropna(how='all', inplace=True)

Если у вас есть только один столбец и вы хотите защитите индекс, затем вы можете попробовать заменить значения NaN подходящим значением, например:

df_final = df.fillna(0)
or
df.fillna(value=0, inplace=True)

Для получения дополнительной информации о 'fillna' вы можете обратиться к этой ссылке .

0 голосов
/ 11 июля 2020

Первый столбец, это просто индекс. Вы должны сбросить индекс после удаления некоторых значений. (Если вы хотите увидеть или добавить старый индекс в свой фрейм данных, установите drop = False. В противном случае старый индекс будет отброшен)

df2 = df2.reset_index(drop=True)

Фрейм данных после удаления некоторых значений содержит только 1201 строку, поэтому строки на 1446 больше нет. Вот почему вы получаете KeyError: 1446

...