从列中删除NaN值会怎样?

时间:2020-07-11 04:00:31

标签: python nan

在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 :(得分:0)

第一列,它只是一个索引。您应该在删除一些值后重置索引。 (如果要查看旧索引或将旧索引添加到数据框中,请设置drop = False。否则,它将删除旧索引)

df2 = df2.reset_index(drop=True)

删除某些值后,您的数据帧仅包含1201行,因此1446处不再有行。这就是为什么您收到KeyError:1446

的原因

答案 1 :(得分:0)

我假设您必须使用“ dropna”功能删除NaN值。您可以使用“ dropna”功能删除各种方式。默认情况下,它按行逐行删除,如果该行中的任何列的值为“ NaN”,则逐行删除。您可以通过设置各种参数来更改此行为,如here所示。

当放置行时,形状肯定会改变。在这种情况下,形状一定不能更改,因为您没有“就位”。无需将“ 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”的更多信息,您可以参考此link