Идея - проверка, если все значения столбца содержат число или строку по Series.str.contains
в DataFrame.apply
и DataFrame.all
, последний фильтр по DataFrame.loc
:
df = df.loc[:, df.astype(str).apply(lambda x: x.str.contains('\d|\w')).all()]
Или:
df = df.loc[:, df.astype(str).apply(lambda x: x.str.contains('\d|[a-zA-Z]')).all()]
print (df)
col_1 col_3 col_4
0 1 ab 1,235
1 2 cd 8,900
2 3 ef 1,235
3 4 gh 8,900
Если возможно, получить все значения для удаления в строке возможно добавить ^
для начала строки и $
для конца строки, а затем инвертировать маску на ~
:
p = """[!"#$%&\'()*+,-./:;<=>?@[\\]^_`{|}~ ]"""
df = df.loc[:, ~df.astype(str).apply(lambda x: x.str.contains('^' + p + '$')).all()]
print (df)
col_1 col_3 col_4
0 1 ab 1,235
1 2 cd 8,900
2 3 ef 1,235
3 4 gh 8,900