удалить строки, содержащие числовые значения в строках из кадра данных панд - PullRequest
0 голосов
/ 11 июня 2018

У меня есть фрейм данных pandas с 2 столбцами, тип и текст. Текстовый столбец содержит строковые значения.Как я могу удалить строки, которые содержат некоторые числовые значения в текстовом столбце.Например:

`ABC 1.3.2`, `ABC12`, `2.2.3`, `ABC 12 1`

Я пробовал ниже, но получаю ошибку.Любая идея, почему это дает ошибку?

df.drop(df[bool(re.match('^(?=.*[0-9]$)', df['text'].str))].index)

Ответы [ 4 ]

0 голосов
/ 11 июня 2018

Ну, как я спросил в комментарии, каково ваше определение числовое.Если мы следуем за isnumeric питона split(), мы получаем следующее:

import pandas as pd

импорт панд в виде отпечатков pd

df = pd.DataFrame({
    'col1': ['ABC', 'ABC 1.3.2', 'DEF', 'ABC12', '2.2.3', 'ABC 12 1', 'GHI']
})

m1 = df['col1'].apply(lambda x: not any(i.isnumeric() for i in x.split()))
m2 = df['col1'].str.isalpha()
m3 = df['col1'].apply(lambda x: not any(i.isdigit() for i in x))
m4 = ~df['col1'].str.contains(r'[0-9]')

print(df.assign(hasnonumeric=m1,isalhpa=m2, isdigit=m3, contains=m4))

# Opting for hasnonumeric
df = df[m1]

:

        col1  hasnonumeric  isalhpa  isdigit  contains
0        ABC          True     True     True      True
1  ABC 1.3.2          True    False    False     False
2        DEF          True     True     True      True
3      ABC12          True    False    False     False
4      2.2.3          True    False    False     False
5   ABC 12 1         False    False    False     False
6        GHI          True     True     True      True
0 голосов
/ 11 июня 2018

В вашем случае, я думаю, лучше использовать простое индексирование, а не отбрасывание.Например:

>>> df
       text type
0       abc    b
1    abc123    a
2       cde    a
3  abc1.2.3    b
4     1.2.3    a
5       xyz    a
6    abc123    a
7      9999    a
8     5text    a
9      text    a


>>> df[~df.text.str.contains(r'[0-9]')]
   text type
0   abc    b
2   cde    a
5   xyz    a
9  text    a

Это находит любые строки без числового текста

Чтобы объяснить:

df.text.str.contains(r'[0-9]')

возвращает логическую серию гдеесть любые цифры:

0    False
1     True
2    False
3     True
4     True
5    False
6     True
7     True
8     True
9    False

, и вы можете использовать это с ~ для индексации вашего кадра данных везде, где возвращается false

0 голосов
/ 11 июня 2018

Данные из jpp

s[s.str.isalpha()]
Out[261]: 
0    ABC
2    DEF
6    GHI
dtype: object
0 голосов
/ 11 июня 2018

Предполагая, что вы определили числовое значение как x.isdigit() с оценкой True, вы можете использовать any с выражением генератора и создать логическую маску с помощью pd.Series.apply:

s = pd.Series(['ABC', 'ABC 1.3.2', 'DEF', 'ABC12', '2.2.3', 'ABC 12 1', 'GHI'])

mask = s.apply(lambda x: not any(i.isdigit() for i in x))

print(s[mask])

0    ABC
2    DEF
6    GHI
dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...