Проблема в применении str.contains в нескольких столбцах в Python - PullRequest
2 голосов
/ 03 апреля 2020

Кадр данных:

col1          col2             col3
132jh.2ad3    34.2             65
298.487       9879.87          1kjh8kjn0
98.47         79.8             90
8763.3        7hkj7kjb.k23l    67
69.3          3765.9           3510

Желаемый вывод:

col1          col2             col3
98.47         79.8             90
69.3          3765.9           3510

Что я пробовал: (это не удаляет все строки с альфа-цифрой c значения)

df=df[~df['col1'].astype(str).str.contains(r'[A-Ba-b]')] #for col1
df=df[~df['col2'].astype(str).str.contains(r'[A-Ba-b]')] #for col2
df=df[~df['col3'].astype(str).str.contains(r'[A-Ba-b]')] #for col3

Я хочу удалить все строки alphanumeri c, и иметь только строки, содержащие только цифры. У Col1 и Col2 есть десятичные точки, но у Col3 есть только целые числа.
Я пробовал несколько других похожих потоков, но это не сработало.

Спасибо за помощь !!

Ответы [ 3 ]

4 голосов
/ 03 апреля 2020

Вы можете просто использовать to_numeric:

df[df.apply(pd.to_numeric, errors='coerce').notnull().all(1)]

Выход:

    col1    col2  col3
2  98.47    79.8    90
4   69.3  3765.9  3510
1 голос
/ 03 апреля 2020

Выполнить:

df[~df.apply(lambda row: row.str.contains(r'[A-Z]', flags=re.I).any(), axis=1)]

( требуется импорт ).

Ваше регулярное выражение содержит [AB] , но оно должно совпадать все буквы (от A до Z ).

Редактировать

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

df[~df.loc[:, 'col1':'col3'].apply(lambda row:
    row.str.contains(r'[A-Z]', flags=re.I).any(), axis=1)]

Таким образом, вы примените ту же функцию, что и выше, к только эти 3 столбца.

0 голосов
/ 03 апреля 2020

Вот решение, которое не требует использования apply (что может быть медленным), а скорее stack

# stack and use isnumeric to see if str is a number or float
# then unstack and dropna
df[df.stack().str.replace('.','').str.isnumeric().unstack()].dropna()

    col1    col2  col3
2  98.47    79.8    90
4   69.3  3765.9  3510
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...