我有一个数据框df,它有一些float64类型的列,而其他的是object。由于混合性质,我无法使用
df.fillna('unknown') #getting error "ValueError: could not convert string to float:"
因为类型为float64的列发生了错误(这是一个误导性错误消息!)
所以我希望我可以做一些像
这样的事情for col in df.columns[<dtype == object>]:
df[col] = df[col].fillna("unknown")
所以我的问题是,是否有任何这样的过滤器表达式,我可以使用df.columns?
我想,或许不那么优雅,我能做到:
for col in df.columns:
if (df[col].dtype == dtype('O')): # for object type
df[col] = df[col].fillna('')
# still puzzled, only empty string works as replacement, 'unknown' would not work for certain value leading to error of "ValueError: Error parsing datetime string "unknown" at position 0"
我也想知道为什么在上面的代码中将''with'unknown'替换为某些单元格,但是在一个单元格失败时出现错误为“ValueError:Error problem dateing date string”unknown at the 0 “
非常感谢!
于
答案 0 :(得分:42)
这是简洁的:
# select the float columns
df_num = df.select_dtypes(include=[np.float])
# select non-numeric columns
df_num = df.select_dtypes(exclude=[np.number])
答案 1 :(得分:27)
您可以使用dtypes属性查看所有列的dtype:
In [11]: df = pd.DataFrame([[1, 'a', 2.]])
In [12]: df
Out[12]:
0 1 2
0 1 a 2
In [13]: df.dtypes
Out[13]:
0 int64
1 object
2 float64
dtype: object
In [14]: df.dtypes == object
Out[14]:
0 False
1 True
2 False
dtype: bool
访问对象列:
In [15]: df.loc[:, df.dtypes == object]
Out[15]:
1
0 a
我认为最明确的是使用(我不是确定 inplace可以在这里工作):
In [16]: df.loc[:, df.dtypes == object] = df.loc[:, df.dtypes == object].fillna('')
这样说,我建议您使用NaN for missing data。
答案 2 :(得分:0)
正如@RNA所说,您可以使用pandas.DataFrame.select_dtypes。使用示例中的问题编写的代码如下:
for col in df.select_dtypes(include=['object']).columns:
df[col] = df[col].fillna('unknown')