在pandas df中选择字符串列(相当于df.select_dtypes)

Who*_*ack 6 python dataframe pandas

给定df具有不同数据类型的 Pandas ,df.select_dtypes对于仅保留所需列或删除特定应用程序不需要的列非常有用。

但是,似乎无法string使用这种方法来解决dtype。

文档(强调我的):

ValueError
  如果 include 和 exclude 都为空
  如果 include 和 exclude 有重叠元素
  如果传入任何类型的字符串 dtype。

要选择字符串,您必须使用对象 dtype,但请注意,这将返回所有对象 dtype 列

实际上, usingdf.select_dtypes(exclude=['str'])会引发错误(尽管它是 aTypeError而不是ValueErrordocs 声称的 a)并且 usingdf.select_dtypes(exclude=['object'])会删除所有object列,而不仅仅是string列。


给出df这样的:

df = pd.DataFrame({'int_col':[0,1,2,3,4],
                   'dict_col':[dict() for i in range(5)],
                   'str_col':list('abcde')})
Run Code Online (Sandbox Code Playgroud)

并考虑到

df.dtypes
Run Code Online (Sandbox Code Playgroud)

object两个str_coldict_col


排除或包含所有字符串列的最佳方法是什么?

cs9*_*s95 10

选项1

使用df.applymaptype,并等于str

In [377]: (df.applymap(type) == str).all(0)
Out[377]: 
dict_col    False
int_col     False
str_col      True
dtype: bool
Run Code Online (Sandbox Code Playgroud)

每列中的每个元素都转换为其类型,然后等于str. 之后,只需致电.all(0).min(0)获得每列的判决。


选项 2

使用df.applymapisinstance

In [342]: df.applymap(lambda x: isinstance(x, str)).all(0)
Out[342]: 
dict_col    False
int_col     False
str_col      True
Run Code Online (Sandbox Code Playgroud)

要包含这些字符串列,您可以对列进行布尔索引:

idx = ... # one of the two methods above
df_new = df[df.columns[idx]]
Run Code Online (Sandbox Code Playgroud)

排除将是

df_new = df[df.columns[~idx]]
Run Code Online (Sandbox Code Playgroud)

  • 很好,谢谢!为了完整起见:实际包含或排除字符串列可以使用 `df.loc[:,(df.applymap(type)==str).all(0)]` 和 `df.loc[:, (df.applymap(type)!=str).all(0)]`,分别。 (2认同)