2017-01-16 2 views
1

У меня есть pandas DataFrame (df), что мне нужно найти точку с запятой. Я впервые попробовал сpandas - поиск символа в DataFrame

semicolon_check = df.to_string().__contains__(';'),

, но это очень медленно, и в случае больших DataFrames я бегу в ошибку памяти. Тогда я попытался перебрать колонн с .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

есть ли более простой способ достижения цели? Вышеприведенное, хотя работа как ожидалось, кажется слишком сложной для такой элементарной задачи, как поиск ценности.

+0

Это не может быть наиболее эффективным способом, но петля безопасно: 'df.applymap (лямбда х:«;»ул (х))'. – Abdou

ответ

5

Вы можете выбирать только строки столбцов с помощью 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 вместе с маской для фильтрации смещ_по_столбцы:

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') 
Смежные вопросы