использование .loc для запроса ненулевых значений и только строковых значений - PullRequest
2 голосов
/ 21 мая 2019

Я пытаюсь запросить фрейм данных, чтобы удалить все нулевые и числовые (int, float) значения.

Мой датафрейм:

make_df = ["Hello", "World", "abcd", 12.4, np.nan,  "qwerty123"]
df = pd.DataFrame(make_df, columns = ["col1"])

Мой код:

df.loc[df["col1"].isna() == False]

Пока все, что я могу сделать, это удалить нулевые значения в DataFrame, но не числовые значения.

Пожалуйста, помогите.

Ответы [ 2 ]

3 голосов
/ 21 мая 2019

Другой подход - заполнить NaN с помощью 0 и отфильтровать числовые значения, используя pd.to_numeric:

df.loc[pd.to_numeric(df.col1.fillna(0),errors='coerce').isna(),'col1']

0        Hello
1        World
2         abcd
5    qwerty123
Name: col1, dtype: object
3 голосов
/ 21 мая 2019

Используйте 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...