对于不同的列,我有一个具有不同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)
您可以遍历它们并使用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!
您可以使用以下方法获取 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)