I think you can add a parameter errors='coerce'to convert bad non-numeric values ββto NaN, and then check these values isnulland use boolean indexing:
print (df[pd.to_numeric(df.col, errors='coerce').isnull()])
Example:
df = pd.DataFrame({'B':['a','7','8'],
'C':[7,8,9]})
print (df)
B C
0 a 7
1 7 8
2 8 9
print (df[pd.to_numeric(df.B, errors='coerce').isnull()])
B C
0 a 7
, - type if is string:
df = pd.DataFrame({'B':['a',7, 8],
'C':[7,8,9]})
print (df)
B C
0 a 7
1 7 8
2 8 9
print (df[df.B.apply(lambda x: isinstance(x, str))])
B C
0 a 7