9

我有一个 Pandas 数据框,不同列的数据类型不同。例如 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
4

6 回答 6

14

您可以遍历它们并使用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!

于 2013-06-18T16:08:34.700 回答
4

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

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

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

并且 int 列不会有 NaN,否则它们将被向上转换为 float

现在您可以以fillna一种厚颜无耻的方式应用各自的 s:

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))
于 2013-06-18T17:11:43.330 回答
2

一个紧凑的版本示例:

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

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

于 2019-01-24T04:37:52.040 回答
1

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

df[df.select_dtypes("object").columns] = df.select_dtypes("object").fillna("")
于 2020-08-28T08:18:13.017 回答
1

@Ryan Saxe 的回答是准确的。为了让它在我的数据上工作,我必须设置inplace=Trueanddata= 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)
于 2019-08-30T10:42:21.573 回答
0

与其一次运行一列的转换,这是低效的,这里有一种方法来获取所有的 int 或 float 列并一次更改。

int_float_cols = df.select_dtypes(include=['int', 'float']).columns
df[int_float_cols] = df[int_float_cols].fillna(value=0)

很明显如何使它适应处理对象。

我知道在 Pandas 旧版本中,整数中不允许有 NA,因此抓取“整数”并不是绝对必要的,它可能会意外地将整数提升为浮点数。但是,在我们的用例中,安全总比后悔好。

我遇到了这个问题,因为普通方法df.fillna(0)破坏了所有的日期时间变量。

于 2022-02-11T15:09:18.280 回答