Как удалить все нечисловые символы из всех значений в определенном столбце в dataframe pandas?

У меня есть dataframe, который выглядит следующим образом:

     A       B           C
1   red78   square    big235
2   green   circle    small123
3   blue45  triangle  big657

Мне нужно иметь возможность удалять нечисловые символы из всех строк в столбце C, чтобы мой фреймворк выглядел так:

     A       B           C
1   red78   square    235
2   green   circle    123
3   blue45  triangle  657

Я попытался использовать следующее, но получить ожидаемую строку или буфер:

import re
dfOutput.imgID = dfOutput.imgID.apply(re.sub('[^0-9]','', dfOutput.imgID), axis = 0)

Что мне делать вместо этого?

Код для создания фрейма данных:

dfObject = pd.DataFrame()
dfObject.set_value(1, 'A', 'red78')
dfObject.set_value(1, 'B', 'square')
dfObject.set_value(1, 'C', 'big235')
dfObject.set_value(2, 'A', 'green')
dfObject.set_value(2, 'B', 'circle')
dfObject.set_value(2, 'C', 'small123')
dfObject.set_value(3, 'A', 'blue45')
dfObject.set_value(3, 'B', 'triangle')
dfObject.set_value(3, 'C', 'big657')

Ответ 1

Используйте str.extract и передайте шаблон регулярного выражения, чтобы извлечь только числовые части:

In[40]:
dfObject['C'] = dfObject['C'].str.extract('(\d+)', expand=False)
dfObject

Out[40]: 
        A         B    C
1   red78    square  235
2   green    circle  123
3  blue45  triangle  657

При необходимости вы можете использовать для int:

dfObject['C'] = dfObject['C'].astype(int)

Ответ 2

Вы можете использовать .str.replace с регулярным выражением:

dfObject['C'] = dfObject.C.str.replace(r"[a-zA-Z]",'')

вывод:

        A         B    C
1   red78    square  235
2   green    circle  123
3  blue45  triangle  657

Ответ 3

Вы также можете сделать это с помощью lambda функции с помощью str.isdigit:

import pandas as pd

df = pd.DataFrame({'Name': ['John5', 'Tom 8', 'Ron 722']})

df['Name'] = df['Name'].map(lambda x: ''.join([i for i in x if i.isdigit()]))

#   Name
# 0    5
# 1    8
# 2  722

Ответ 4

Через 2 года, чтобы помочь другим, я на самом деле думаю, что вы были очень близки к ответу. Я использовал вашу логику, но заставил ее работать. в основном вы создаете функцию, которая выполняет очистку, а затем применяете ее к столбцу C

import pandas as pd
import re

df = pd.DataFrame({
     'A': ['red78', 'green', 'blue45'],
     'B': ['square', 'circle', 'triangle'],
    'C': ['big235', 'small123',  'big657']
})

def remove_chars(s):
    return re.sub('[^0-9]+', '', s) 

df['C'] = df['C'].apply(remove_chars)
df

Результат ниже:

A   B   C
0   red78   square  235
1   green   circle  123
2   blue45  triangle    657

Ответ 5

Чтобы удалить все нецифровые символы из строк в столбце Pandas, вы должны использовать str.replace с шаблонами \D+ или [^0-9]+:

dfObject['C'] = dfObject['C'].str.replace(r'\D+', '')

Или, поскольку в Python 3 \D по умолчанию полностью поддерживает Unicode и, следовательно, не соответствует цифрам, не относящимся к ASCII (например, ۱۲۳۴۵۶۷۸۹, см. доказательство), вам следует учитывать

dfObject['C'] = dfObject['C'].str.replace(r'[^0-9]+', '')

Так,

import re
print ( re.sub( r'\D+', '', '1۱۲۳۴۵۶۷۸۹0') )         # => 1۱۲۳۴۵۶۷۸۹0
print ( re.sub( r'[^0-9]+', '', '1۱۲۳۴۵۶۷۸۹0') )     # => 10