如何从pandas dataframe中特定列的所有值中删除所有非数字字符?

时间:2017-05-22 15:59:58

标签: python 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')

5 个答案:

答案 0 :(得分:10)

使用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)

答案 1 :(得分:5)

您可以将.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

答案 2 :(得分:1)

您也可以通过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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

要从“熊猫”列中的字符串中删除所有非数字字符,应将str.replace\D+[^0-9]+模式一起使用:

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

或者,由于在Python 3中,\D默认情况下完全支持Unicode,因此与非ASCII数字不匹配(例如۱۲۳۴۵۶۷۸۹,请参见proof),您应该考虑< / p>

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