如果包含NaN的列如何转换为int?

时间:2018-10-19 00:35:40

标签: python pandas integer nan

我正在研究这个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

2 个答案:

答案 0 :(得分:0)

您可以将它们转换为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)

答案 1 :(得分:0)

我刚刚复制了您的要求,这是执行此操作的几种方法,但是我看到您已经有一个整数值,并且只有NaN个丢失的位置,您可以将其转换为int或说{{ 1}},因为它们丢失了。

zero

方法1

直接从熊猫文档中摘录,Document Link For pandas.DataFrame.fillna

因此,由于您有多个列,但只想替换它们的一个子集中的NaN,您可以使用,我想最好将 >>> 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 替换为NaN,而不是跳过空白..

0

如果要将更改永久保留在DataFrame中,则可以使用:

>>> 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

方法2

您可以使用>>> efw.fillna({'Rank':'0', 'Quartile':'0'}, inplace=True) >>> print(efw) 为列使用dtype来检查dtype.kind是否为数字。

apply

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

*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

方法3

OR对于数据框,您只需使用 >>> 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 方法。这将把所有的NaN都转换为零,而与您拥有的列无关。

DataFrame.fillna()

注意:如果要删除>>> 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 并将其留空,可以使用fillna('')而不是fillna(0)