代码之家  ›  专栏  ›  技术社区  ›  Pythonista anonymous

如何将数据帧列转换为字符串并替换NAN(fillna不工作)

  •  2
  • Pythonista anonymous  · 技术社区  · 7 年前

    我有一个包含整数列的pandas数据帧,其中包含一些NaN。我想将它们从整数转换为字符串,并用“不可用”之类的描述替换NAN。

    主要原因是我需要在该列上运行groupbys,除非我转换NaN,否则groupby将摆脱它们!为什么会发生这种情况,以及整个熊猫群体如何没有挺身而出,这是一个完全不同的讨论(当我第一次了解它时,我简直不敢相信……)。

    我已经尝试了下面的代码,但它不起作用。请注意,我已经尝试了这两种方法 astype(str) astype('str' ). 在这两种情况下,列都转换为object,而不是string;也许是因为Python假设(错误的是,它们在我的数据帧中的长度都相同)字符串的长度不同?但是,最重要的是,fillna()不起作用,而NAN保持NAN!为什么?

    import numpy as np
    import pandas as pd
    
    df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e'])
    df.iloc[0,0]=np.nan
    df['a']=df['a'].astype(str)
    df['a']=df['a'].fillna('not available')
    print(df.dtypes)
    print(df.head())
    
    2 回复  |  直到 3 年前
        1
  •  5
  •   Scott Boston    7 年前

    fillna 将这些值转换为“str”后将不起作用,您不再具有np。nan,但字符串值为“nan”:

    df= pd.DataFrame(np.random.randint(1,10,(10000,5)), columns=['a','b','c','d','e'])
    df.iloc[0,0]=np.nan
    #df['a']=df['a'].astype(str) <-- You don't need this line.
    df['a']=df['a'].fillna('not available')
    print(df.dtypes)
    print(df.head())
    

    输出:

    a    object
    b     int32
    c     int32
    d     int32
    e     int32
    dtype: object
                   a  b  c  d  e
    0  not available  6  3  9  7
    1              5  4  5  5  3
    2              4  2  5  3  2
    3              4  9  2  8  3
    4              2  6  5  9  1
    
        2
  •  0
  •   BENY    7 年前
    df= pd.DataFrame(np.random.randint(1,10,(10,5)), columns=['a','b','c','d','e'])
    df.iloc[0,0]=np.nan
    
    df.isnull()
    Out[329]: 
           a      b      c      d      e
    0   True  False  False  False  False
    1  False  False  False  False  False
    2  False  False  False  False  False
    3  False  False  False  False  False
    4  False  False  False  False  False
    5  False  False  False  False  False
    6  False  False  False  False  False
    7  False  False  False  False  False
    8  False  False  False  False  False
    9  False  False  False  False  False
    

    更改为str后

    df['a']=df['a'].astype(str)
    
    df.isnull()
    Out[332]: 
           a      b      c      d      e
    0  False  False  False  False  False
    1  False  False  False  False  False
    2  False  False  False  False  False
    3  False  False  False  False  False
    4  False  False  False  False  False
    5  False  False  False  False  False
    6  False  False  False  False  False
    7  False  False  False  False  False
    8  False  False  False  False  False
    9  False  False  False  False  False
    

    您更改空值,该值为 np.nan 到字符串 'nan'

    df.iloc[0,0]
    Out[334]: 'nan'