Используйте to_numeric
с errors='coerce'
при проверке не пропущенные значения прикованы к проверке при пропущенных значениях:
df1 = df[pd.to_numeric(df["col1"], errors='coerce').isna() & df["col1"].notna()]
Или возможен тест по isinstance
, если необходимо различать строковое представление числовых и числовых значений:
df1 = df[~df['col1'].apply(lambda x: isinstance(x, (float, int)))]
print (df1)
col1
0 Hello
1 World
2 abcd
5 qwerty123
Проверить разницу в решениях - 10
это строковый ответ числового значения:
make_df = ["Hello", "World", "abcd", 12.4, np.nan, "qwerty123", "10"]
df = pd.DataFrame(make_df, columns = ["col1"])
print (df)
col1
0 Hello
1 World
2 abcd
3 12.4
4 NaN
5 qwerty123
6 10
df1 = df[pd.to_numeric(df["col1"], errors='coerce').isna() & df["col1"].notna()]
print (df1)
col1
0 Hello
1 World
2 abcd
5 qwerty123
df2 = df[~df['col1'].apply(lambda x: isinstance(x, (float, int)))]
print (df2)
col1
0 Hello
1 World
2 abcd
5 qwerty123
6 10