一尘不染

在 Pandas 中查找类型为浮点数或特定类型的所有数据框列? 13 python:在存在字符

pandas

我有一个数据框 df,它有一些 float64 类型的列,而其他的则是对象。由于混合性质,我不能使用

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" 

我也想知道为什么在上面的代码中用 ‘unknown’ 替换 ‘’ 代码对某些单元格有效,但由于单元格失败,错误为“ValueError: Error parsing datetime string “unknown” at position 0”

非常感谢!


阅读 202

收藏
2022-06-12

共2个答案

一尘不染

这更简洁:

# select the float columns
df_num = df.select_dtypes(include=[np.float])
# select non-numeric columns
df_num = df.select_dtypes(exclude=[np.number])
2022-06-12
一尘不染

您可以使用 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('')
2022-06-12