在pandas数据帧中查找字符串元素的位置

时间:2015-03-28 17:25:54

标签: python pandas

我有一个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

2 个答案:

答案 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']
相关问题