Python 数据帧对象类型在不同数据类型上填充异常
我有一个熊猫数据框,不同的列有不同的数据类型。例如,df.dtypes返回以下内容Python 数据帧对象类型在不同数据类型上填充异常,python,pandas,Python,Pandas,我有一个熊猫数据框,不同的列有不同的数据类型。例如,df.dtypes返回以下内容 Date datetime64[ns] FundID int64 FundName object CumPos int64 MTMPrice float64 PricingMechan
Date datetime64[ns]
FundID int64
FundName object
CumPos int64
MTMPrice float64
PricingMechanism object
许多cheese列中都缺少值。使用NaN值对其执行组操作会导致问题。显然,使用.fillna()方法来摆脱它们是一个不错的选择。问题是字符串的clouse是.fillna(“”),而.fillna(0)是int和float的正确选择。在DataFrame上使用任一方法都会引发异常。除了单独操作(大约有30列)之外,还有什么优雅的解决方案吗?根据数据帧,我有很多代码,我不希望重新键入列,因为这可能会破坏其他逻辑。
可以做:
您可以遍历它们并使用
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("")
当您迭代一个数据帧时,您将获得每个列的名称,因此要访问这些列,您可以使用
df[col]
。这样您就不需要手动执行,脚本只需遍历每一列并检查其数据类型 您可以使用以下方法获取float64和object列:
In [11]: float_cols = df.blocks['float64'].columns
In [12]: object_cols = df.blocks['object'].columns
int列将不会有nan,否则它们会有
现在,您可以采用一种厚颜无耻的方式应用相应的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))
精简版示例:
#replace Nan with '' for columns of type 'object'
df=df.select_dtypes(include='object').fillna('')
但是,在执行上述操作之后,数据帧将只包含“object”类型的列。要保留所有列,请使用@Ryan Saxe提出的解决方案。@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)
与@Guddi类似:有点冗长,但比@Ryan的答案更简洁,保留所有专栏:
df[df.select_dtypes("object").columns] = df.select_dtypes("object").fillna("")
您需要
inplace=True
才能使用(或分配列)注意:尽管这是一个巧妙的技巧,但它是否是一个真正的“有效”语法仍存在一些争议:)请参见df.blocks是新版本0.11.0method@Joop值得升级,而不仅仅是块!:)
df[df.select_dtypes("object").columns] = df.select_dtypes("object").fillna("")