查找类型为float或特定类型的Pandas中的所有数据框列?

Yu *_*hen 42 python dataframe pandas data-cleaning

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

df.fillna('unknown') #getting error "ValueError: could not convert string to float:"
Run Code Online (Sandbox Code Playgroud)

因为错误发生在类型为float64的列上(这是一个误导性错误消息!)

所以我希望我能做点什么

for col in df.columns[<dtype == object>]:
    df[col] = df[col].fillna("unknown")
Run Code Online (Sandbox Code Playgroud)

所以我的问题是,是否有任何这样的过滤器表达式,我可以使用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" 
Run Code Online (Sandbox Code Playgroud)

我也想知道为什么在上面的代码中用''with'unknown'替换代码可以用于某些单元但是失败的单元格中出现"ValueError:Error parsing datetime string",错误"位置0"

非常感谢!

RNA*_*RNA 55

这很简洁:

# select the float columns
df_num = df.select_dtypes(include=[np.float])
# select non-numeric columns
df_num = df.select_dtypes(exclude=[np.number])
Run Code Online (Sandbox Code Playgroud)

  • 仅供参考,``.select_dtypes``出现在0.14.1,IIRC @Andy soln就在那之前 (3认同)

And*_*den 33

您可以使用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
Run Code Online (Sandbox Code Playgroud)

要访问对象列:

In [15]: df.loc[:, df.dtypes == object]
Out[15]: 
   1
0  a
Run Code Online (Sandbox Code Playgroud)

我认为这是最明确的使用(我不确定 inplace在这里工作):

In [16]: df.loc[:, df.dtypes == object] = df.loc[:, df.dtypes == object].fillna('')
Run Code Online (Sandbox Code Playgroud)

说,我建议您使用NaN来丢失数据.


Jar*_*děk 5

正如@RNA 所说,您可以使用pandas.DataFrame.select_dtypes。使用您的问题示例的代码如下所示:

for col in df.select_dtypes(include=['object']).columns:
    df[col] = df[col].fillna('unknown')
Run Code Online (Sandbox Code Playgroud)