显示所有对象的dtypes,在str上进行筛选



我有一个df,它有str、int和timestamp列。然而,当我请求dtypes时,除了时间戳之外,我得到的所有东西都是对象,如下所示:

ABC                         datetime64[ns]
BCD                         datetime64[ns]
CDF                                 object
DEF                                 object
EFG                                 object
FGH                                 object

我在某个地方读到,当字符串列中缺少值时,就会发生这种情况,Pandas将它们存储为浮点值,因此该列变为对象类型。当我做以下操作时,我可以看到类型:

t = {col: set(d_session.loc[~pd.isnull(d_session[col]), 
col].apply(type).drop_duplicates()) for col in d_session}
t

我得到的结果如下:

{'ABC': {pandas._libs.tslibs.timestamps.Timestamp},
'BCD': {pandas._libs.tslibs.timestamps.Timestamp},
'CDE': {str},
'DEF': {str},
'EFG': {str},
'FGH': {str}}

我现在的任务是找到一种方法,可以过滤str以外的所有列,并创建一个新的df。需要明确的是,我只希望在这个新的df中使用str列。但我无法使用以上知识进行过滤。我试过以下内容:

for i in t.keys():
print(t[i] == "{<class 'str'>}")

我得到:

False
False
False
False
False
False

有人能帮我怎么做吗?我对如何做并不挑剔,所以它实际上不必是上面的修改。非常感谢您的帮助

您可以使用select_dtypes排除所有对象(字符串(数据类型:

df.select_dtypes(exclude=object)

如果您有一些列包含列表或dict等数据,则可以按照@mozway:的建议在之前使用convert_dtypes

df.convert_dtypes('string').select_dtypes(exclude='string')

根据您的想法,您可以使用:

d_session.loc[:, d_session.apply(lambda x: isinstance(x.dropna().iloc[0], str))]

要获得具有字符串值的列列表,可以使用以下命令:

str_cols = [x for x in df.columns if type(df[x].loc[df[x].first_valid_index()])==str]

此代码将忽略丢失的值并检查数据类型。您只需更改条件即可获得具有str.以外值的列

最新更新