我有一个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
答案 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= 0
和data= ""
。参见下面的代码:
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("")