【问题标题】:How can I convert a column to int if it contains NaNs?如果列包含 NaN,如何将其转换为 int?
【发布时间】:2019-03-23 20:58:00
【问题描述】:

我正在处理这个efw 数据框:

2   Year    ISO_Code    Countries   INDEX   Rank    Quartile
3   2016    ALB         Albania     7.54    34      1
4   2016    DZA         Algeria     4.99    NaN     4
5   2016    AGO         Angola      5.17    155     4
6   2016    ARG         Argentina   4.84    160     NaN
7   2016    ARM         Armenia     7.57    NaN     1
8   2016    AUS         Australia   7.98    10      1
9   2016    AUT         Austria     7.58    27      NaN

假设我想将RankQuartile 列中的所有值转换为整数,如果它们不是NaN。我试过efw[["Year", "Rank", "Quartile"]].astype(int),但一直收到这个错误:ValueError: cannot convert float NaN to integer

有没有办法告诉 Python “跳过”NaN 值,只将其他值转换为 int

【问题讨论】:

  • 使用isnull() 方法添加过滤器。
  • 感谢@Prune 的建议!这条线会是什么样子? efw.insnull(efw[["Year", "Rank", "Quartile"]].astype(int)) ?
  • efw[['Year', 'Rank', 'Quartile']].isnull()。或者,如果您想查看每列的 NaN 值总数,也可以使用 sum。就像efw.isnull().sum()
  • 您当前的列 dtype 是什么?
  • 它将在下一个版本的熊猫中出现。 pandas-docs.github.io/pandas-docs-travis/… 否则 np.nans 强制列为浮点数。

标签: python pandas integer nan


【解决方案1】:

您可以将它们转换为object

efw[["Year", "Rank", "Quartile"]].astype(object)
Out[58]: 
   Year Rank Quartile
0  2016   34        1
1  2016  NaN        4
2  2016  155        4
3  2016  160      NaN
4  2016  NaN        1
5  2016   10        1
6  2016   27      NaN

#efw[["Year", "Rank", "Quartile"]]=efw[["Year", "Rank", "Quartile"]].astype(object)

【讨论】:

    【解决方案2】:

    我刚刚复制了您的要求,这里有几种方法可以做到这一点,但是我看到您已经有一个整数值,只有缺少的地方为 NaN,您可以将其转换为 int 或说 zero 为那些都不见了。

        >>> efw
       Year ISO_Code  Countries  Index Rank Quartile
    0  2016      ALB    Albania   7.54   34        1
    1  2016      DZA    Algeria   4.99  NaN        4
    2  2016      AGO     Angola   5.17  155        4
    3  2016      ARG  Argentina   4.84  160      NaN
    4  2016      ARM    Armenia   7.57  NaN        1
    5  2016      AUS  Australia   7.98   10        1
    6  2016      AUT    Austria   7.58   27      NaN
    

    方法一

    直接来自 pandas 文档,即使我们有更好的方法,Document Link For pandas.DataFrame.fillna

    所以,由于您有多个列,但只想替换其中一部分中的 NaN,您可以使用,我会说最好将 NaN 替换为 0 而不是跳过空白..

    >>> efw.fillna({'Rank':'0', 'Quartile':'0'}, inplace=False)
       Year ISO_Code  Countries  Index Rank Quartile
    0  2016      ALB    Albania   7.54   34        1
    1  2016      DZA    Algeria   4.99    0        4
    2  2016      AGO     Angola   5.17  155        4
    3  2016      ARG  Argentina   4.84  160        0
    4  2016      ARM    Armenia   7.57    0        1
    5  2016      AUS  Australia   7.98   10        1
    6  2016      AUT    Austria   7.58   27        0
    

    如果您想让更改在 DataFrame 中永久生效,那么您可以使用:

    >>> efw.fillna({'Rank':'0', 'Quartile':'0'}, inplace=True)
    >>> print(efw)
    

    方法二

    您可以使用apply 为您的列检查dtype 是否为数字dtype.kind,如下所示..

    *dtype.kind:* A character code (one of ‘biufc’) identifying the general kind of data.
    
    b boolean
    i signed integer
    u unsigned integer
    f floating-point
    c complex floating-point
    

    因此,您可以将 apply 与 lambda 函数一起使用,如下所示..

     >>> efw.apply(lambda x: x.fillna(0) if x.dtype.kind in 'biufc' else x.fillna('0'))
       Year ISO_Code  Countries  Index Rank Quartile
    0  2016      ALB    Albania   7.54   34        1
    1  2016      DZA    Algeria   4.99    0        4
    2  2016      AGO     Angola   5.17  155        4
    3  2016      ARG  Argentina   4.84  160        0
    4  2016      ARM    Armenia   7.57    0        1
    5  2016      AUS  Australia   7.98   10        1
    6  2016      AUT    Austria   7.58   27        0
    

    方法3

    或使用您的数据框,您只需使用DataFrame.fillna() 方法。这会将所有 NaN 转换为零,而与您拥有的列无关。

    >>> efw.fillna(0)
       Year ISO_Code  Countries  Index Rank Quartile
    0  2016      ALB    Albania   7.54   34        1
    1  2016      DZA    Algeria   4.99    0        4
    2  2016      AGO     Angola   5.17  155        4
    3  2016      ARG  Argentina   4.84  160        0
    4  2016      ARM    Armenia   7.57    0        1
    5  2016      AUS  Australia   7.98   10        1
    6  2016      AUT    Austria   7.58   27        0
    

    注意:如果您想删除 NaN 并将其留空,您可以使用 fillna('') 而不是 fillna(0)

    【讨论】:

      猜你喜欢
      • 2014-02-12
      • 2023-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-21
      • 1970-01-01
      相关资源
      最近更新 更多