我有一个pandas数据框,我怀疑它包含一些字符串
>>> d2
1 2 3 4 5 6 7 8 9 10 ... 1771 \
0 0 0 0 0 0 0 0 0 0 0 ... 0
1 0 0 0 0 0 0 0 0 0 0 ... 0
2 0 0 0 0 0 0 0 0 0 0 ... 0
3 0 0 0 0 0 0 0 0 0 0 ... 0
4 0 0 0 0 0 0 0 0 0 0 ... 0
5 0 0 0 0 0 0 0 0 0 0 ... 0
6 0 0 0 0 0 0 0 0 0 0 ... 0
7 0 0 0 0 0 0 0 0 0 0 ... 0
8 0 0 0 0 0 0 0 0 0 0 ... 0
9 0 0 0 0 0 0 0 0 0 0 ... 0
1772 1773 1774 1775 1776 1777 1778 1779 1780
0 0 0 0 0 0 0 1 398 2
1 0 0 0 0 0 0 1 398 2
2 0 0 0 0 0 0 1 398 2
3 0 0 0 0 0 0 1 398 2
4 0 0 0 0 0 0 1 398 2
5 0 0 0 0 0 0 1 398 2
6 0 0 0 0 0 0 1 398 2
7 0 0 0 0 0 0 1 398 2
8 0 0 0 0 0 0 1 398 2
9 0 0 0 0 0 0 1 398 2
[10 rows x 1780 columns]
>>> any(d2.applymap(lambda x: type(x) == str))
True
>>>
我想找到哪些元素是字符串,以防删除包含这些元素的列。
我该怎么做?
我得到一个奇怪的结果。似乎所有列都有dtype int或float,但同时似乎有些元素是字符串。这怎么可能?
>>> d2.dtypes.drop_duplicates()
1 int64
1755 float64
dtype: object
>>> any(d2.applymap(lambda x: type(x) == str))
True
答案 0 :(得分:2)
我会说你因为你使用的方法而得到误报。
以下是我要做的事情:
要选择可能包含文本的所有列,您可以使用此命令:
df.select_dtypes(include=['object']).columns
或者:
df.select_dtypes(exclude=['number']).columns
要检查数据框中的任何单元格是否为文本,请使用以下命令:
df.applymap(lambda x: isinstance(x, str)).any().any()
或者删除上一个.any()
以查看所有包含文本但不包含文本的列:
df.applymap(lambda x: isinstance(x, str)).any()
调用any(your_dataframe)
(将数据框作为参数)会给出误报。
答案 1 :(得分:1)
使用列表推导检查每列的类型,然后排除对象:
df[[col for col in df if df[col].dtype != 'O']] # 'O' is letter O (not zero)
我不确定我理解你的评论如下,所以我将用一个简单的例子进一步解释:
d2 = pd.DataFrame({'a': [1, 2], 'b': ['a', 1], 'c': [2, 3]})
>>> d2
a b c
0 1 a 2
1 2 1 3
>>> d2.applymap(lambda x: type(x))
a b c
0 <type 'numpy.int64'> <type 'str'> <type 'numpy.int64'>
1 <type 'numpy.int64'> <type 'int'> <type 'numpy.int64'>
>>> d2.applymap(lambda x: type(x) == str)
a b c
0 False True False
1 False False False
请注意,您应该使用isinstance(x,target_type)来检查x是否为target_type类型:
>>> d2.applymap(lambda x: isinstance(x, str))
a b c
0 False True False
1 False False False
测试每列的类型:
>>> [d2[col].dtype for col in d2]
[dtype('int64'), dtype('O'), dtype('int64')]
解决方案显然有效:
>>> d2[[col for col in d2 if d2[col].dtype != 'O']]
a c
0 1 2
1 2 3
列出所有“对象”类型的列:
>>> [col for col in d2 if d2[col].dtype == 'O']
['b']