2013-11-08 10 views
14

У меня есть дата-карта данных pandas, называемая данными, и я хочу удалить все строки, содержащие строку в любом столбце. Например, ниже мы видим в колонке «ввп» имеет строку с индексом 3, и «шапка» в индексе 1.python: удалите все строки в dataframe pandas, которые содержат строку

data = 

    y gdp cap 
0 1 2 5 
1 2 3 ab 
2 8 7 2 
3 3 bc 7 
4 6 7 7 
5 4 8 3 
... 

Я пытался использовать что-то вроде этого сценария, потому что я не знаю, что содержится в exp_list раньше времени. К сожалению, «data.var_name» выбрасывает эту ошибку: объект DataFrame не имеет атрибута «var_name». Я также не знаю, что строки будут раньше времени, так или иначе, чтобы обобщить это также?

exp_list = ['gdp', 'cap'] 

for var_name in exp_list: 
    data = data[data.var_name != 'ab'] 

ответ

13

Вы можете применить функцию, которая проверяет ряды вашего DataFrame на наличие строк, например, сказать, что df вашего DataFrame

rows_with_strings = df.apply(
     lambda row : 
      any([ isinstance(e, basestring) for e in row ]) 
     , axis=1) 

Это создаст маску для вашего DataFrame указания того, какие строки содержат по крайней мере одну строку. Таким образом, вы можете выбирать строки без строк через противоположную маску

df_with_no_strings = df[~rows_with_strings] 

.

Пример:

a = [[1,2],['a',2], [3,4], [7,'d']] 
df = pd.DataFrame(a,columns = ['a','b']) 


df 
    a b 
0 1 2 
1 a 2 
2 3 4 
3 7 d 

select = df.apply(lambda r : any([isinstance(e, basestring) for e in r ]),axis=1) 

df[~select]                                 

    a b 
0 1 2 
2 3 4 
+1

Этот стихотворный элемент мудрый? –

+1

@romainjouin, он исключает строку в случае, если строка присутствует в любом из ее элементов – Acorbe

1

Вы можете взять транспонирование, называют `` `convert_objects``, который работает колонна-мудра, а затем сравнить типы данных, чтобы получить булев ключ, как это:

df[df.T.convert_objects().dtypes != object] 
Смежные вопросы