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
而不是ValueError
docs 声称的 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_col
和dict_col
:
排除或包含所有字符串列的最佳方法是什么?
cs9*_*s95 10
选项1
使用df.applymap
和type
,并等于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.applymap
和isinstance
:
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)