我有一个pandas DataFrame(df
),我需要搜索分号.我第一次尝试
semicolon_check = df.to_string().__contains__(';')
,
但它非常慢,如果是大型DataFrame,我会遇到内存错误.然后我尝试循环遍历列.str
,但不是所有列都是字符串,所以每当我到达数字列时,我收到一个错误
AttributeError: Can only use .str accessor with string values, which use np.object_ dtype in pandas
所以我最终得到了这段代码
for col in df.columns:
if df[col].dtype == 'O':
if df[col].str.contains(r';').any():
print 'found in ' + col
是否有更简单的方法来实现目标?上面的内容虽然按预期工作,但对于像价值搜索这样的基本任务来说似乎有点过分了.
您可以使用过滤只是字符串列select_dtypes
,然后调用apply
并传递一个lambda
叫str.contains
同any
:
In [33]: # create a test df df = pd.DataFrame({'int':np.arange(5), 'str':['a','a;a',';','b','c'], 'flt':np.random.randn(5), 'other str':list('abcde')}) df Out[33]: flt int other str str 0 1.020561 0 a a 1 0.022842 1 b a;a 2 -1.207961 2 c ; 3 1.092960 3 d b 4 -1.560300 4 e c In [35]: # filter on dtype test = df.select_dtypes([np.object]).apply(lambda x: x.str.contains(';').any()) test Out[35]: other str False str True dtype: bool
我们可以使用过滤后的df中的columns数组和掩码来过滤cols:
In [36]: # we can use the above to mask the columns str_cols = df.select_dtypes([np.object]).columns str_cols[test] Out[36]: Index(['str'], dtype='object')