2014-10-28 108 views
0

我在一系列的列中缺少值,因此命令dataframe.colname.astype("int64")会产生错误。在熊猫系列中将NaN转换为int

任何解决方法?

+0

'NaN'不能表示为Int64因此错误,您可以将您的值转换为字符串,然后用字符串'NaN'替换缺失的值,或者将其保留为浮点数,因为它支持'NaN ' – EdChum 2014-10-28 19:49:59

+0

当前的'dtype'是什么?你不能只使用'np.float64'吗? – EdChum 2014-10-28 19:51:07

+0

实际上它是float64,但它是一个小数,并且我想最终将这些值与数据库中的整数进行比较(它们是某种类型的ID) – user3659451 2014-10-28 19:53:00

回答

0

pd.Series的数据类型或dtype对其使用的实际方式几乎没有影响。

您可以有整数pd.Series,并将dtype设置为object。你仍然可以用pd.Series做同样的事情。

但是,如果您手动设置dtypespd.Series,则熊猫将开始在pd.Series内投射条目。根据我的经验,这只会导致混淆。

不要试图在关系数据库中使用dtypes作为字段类型。它们不是同一件事。

如果你想要有 s/None s在pd.Series混合,只需将dtype设置为object

设置的dtypefloat会让你有int小号float陈述和NaN S混合。但请记住,float s为容易被unexact in their representation

dtypes一个常见的错误,我应该提到的是pd.merge操作,这会悄悄地拒绝加入时使用的键有不同的dtypes,例如int VS object即使object只包含int s。

其他解决方法

  1. 您可以使用Series.fillna method的东西不可能填补你的NaN值。 0-1
  2. NaN s复制到新列df['was_nan'] = pd.isnull(df['floatcol']),然后使用Series.fillna method。这样你就不会丢失任何信息。
  3. 当调用Series.astype()方法时,请为其指定关键字参数raise_on_error=False,如果失败,请使用当前的dtype。因为dtypes并不重要。

TLDR;

不要专注于'正确的dtype',dtypes很奇怪。专注于您想要列实际执行的操作。 dtype=object很好。