Pandas Dataframe对象在不同的​​数据类型上输入fillna异常

时间:2013-06-18 15:55:43

标签: python pandas

我有一个Pandas Dataframe,不同的列有不同的dtypes。例如。 df.dtypes返回以下内容。

Date                    datetime64[ns]
FundID                           int64
FundName                        object
CumPos                           int64
MTMPrice                       float64
PricingMechanism                object

各种奶酪色谱柱都缺少价值。使用NaN值对其执行组操作会导致问题。用.fillna()方法摆脱它们是显而易见的选择。问题是字符串的明显clouse是.fillna(“”),而.fillna(0)是整数和浮点数的正确选择。在DataFrame上使用任一方法都会引发异常。任何优雅的解决方案,除了单独做它们(有大约30列)?我有很多代码,具体取决于DataFrame,并且不希望重新键入列,因为它可能会破坏其他逻辑。 可以这样做:

df.FundID.fillna(0)
df.FundName.fillna("")
etc

5 个答案:

答案 0 :(得分:6)

您可以遍历它们并使用if语句!

for col in df:
    #get dtype for column
    dt = df[col].dtype 
    #check if it is a number
    if dt == int or dt == float:
        df[col].fillna(0)
    else:
        df[col].fillna("")

当您遍历pandas DataFrame时,您将获得每个列的名称,因此要访问这些列,请使用df[col]。这样您就不需要手动执行,脚本可以遍历每一列并检查其dtype!

答案 1 :(得分:3)

您可以使用以下方法获取float64和object列:

In [11]: float_cols = df.blocks['float64'].columns

In [12]: object_cols = df.blocks['object'].columns

和int列不会有NaN,而是would be upcast to float

现在你可以应用相应的fillna,一种厚颜无耻的方式:

In [13]: d1 = dict((col, '') for col in object_cols)

In [14]: d2 = dict((col, 0) for col in float_cols)

In [15]: df.fillna(value=dict(d1, **d2))

答案 2 :(得分:1)

紧凑版示例:

#replace Nan with '' for columns of type 'object'
df=df.select_dtypes(include='object').fillna('') 

但是,在执行上述操作之后,数据框将仅包含“对象”类型的列。要保留所有列,请使用@Ryan Saxe提出的解决方案。

答案 3 :(得分:0)

@Ryan Saxe的答案很准确。为了使其适用于我的数据,我必须设置inplace=True以及data= 0data= ""。参见下面的代码:

for col in df:
    #get dtype for column
    dt = df[col].dtype 
    #check if it is a number
    if dt == int or dt == float:
        df[col].fillna(data=0, inplace=True)
    else:
        df[col].fillna(data="", inplace=True)

答案 4 :(得分:0)

类似于@Guddi:有点冗长,但比@Ryan的答案更简洁,并保留所有列:

df[df.select_dtypes("object").columns] = df.select_dtypes("object").fillna("")