Python: удалить все строки в pandas dataframe, содержащие строку

У меня есть данные данных pandas, и я хочу удалить все строки, содержащие строку в любом столбце. Например, ниже мы видим, что столбец "gdp" имеет строку с индексом 3 и "cap" в индексе 1.

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
...

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

exp_list = ['gdp', 'cap']

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

Ответы

Ответ 1

Вы можете применить функцию, которая проверит по строкам ваш 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

Ответ 2

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

df[df.T.convert_objects().dtypes != object]