Pandas Dataframe对象类型Fillna异常在不同数据类型上

Joo*_*oop 7 python pandas

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

Date                    datetime64[ns]
FundID                           int64
FundName                        object
CumPos                           int64
MTMPrice                       float64
PricingMechanism                object
Run Code Online (Sandbox Code Playgroud)

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

df.FundID.fillna(0)
df.FundName.fillna("")
etc
Run Code Online (Sandbox Code Playgroud)

Rya*_*axe 8

您可以遍历它们并使用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("")
Run Code Online (Sandbox Code Playgroud)

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

  • 您需要``inplace = True''才能工作(或分配列) (2认同)

And*_*den 6

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

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

In [12]: object_cols = df.blocks['object'].columns
Run Code Online (Sandbox Code Playgroud)

并且 int 列不会有 NaN,否则它们将被向上转换为 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))
Run Code Online (Sandbox Code Playgroud)