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

ag1*_*g14 13 python dataframe pandas

我有一个如下所示的数据框:

     A       B           C
1   red78   square    big235
2   green   circle    small123
3   blue45  triangle  big657
Run Code Online (Sandbox Code Playgroud)

我需要能够从列C中的所有行中删除非数字字符,以便我的数据框看起来像:

     A       B           C
1   red78   square    235
2   green   circle    123
3   blue45  triangle  657
Run Code Online (Sandbox Code Playgroud)

我尝试使用以下,但得到错误预期的字符串或缓冲区:

import re
dfOutput.imgID = dfOutput.imgID.apply(re.sub('[^0-9]','', dfOutput.imgID), axis = 0)
Run Code Online (Sandbox Code Playgroud)

我该怎么做呢?

用于创建数据帧的代码:

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')
Run Code Online (Sandbox Code Playgroud)

EdC*_*ica 16

使用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
Run Code Online (Sandbox Code Playgroud)

如果需要,你可以投射到int:

dfObject['C'] = dfObject['C'].astype(int)
Run Code Online (Sandbox Code Playgroud)

  • 以这种方式使用的“提取”将仅从输入字段中提取一个数字字符序列。如果有多个数字部分用非数字字符分隔,则此答案将仅提取第一个字符序列。 (2认同)
  • @Superdooperhero尝试使用正则表达式模式'(\ d + \。* \ d *)'或仅使用其他答案将字符替换为空字符串,剩下的全部是数字字符 (2认同)

Wik*_*żew 15

要从 Pandas 列中的字符串中删除所有非数字字符,您应该使用str.replacewith\D+[^0-9]+patterns:

dfObject['C'] = dfObject['C'].str.replace(r'\D+', '')
Run Code Online (Sandbox Code Playgroud)

或者,由于在 Python 3 中,\D默认情况下完全识别Unicode,因此不匹配非 ASCII 数字(如?????????,请参阅proof),您应该考虑

dfObject['C'] = dfObject['C'].str.replace(r'[^0-9]+', '')
Run Code Online (Sandbox Code Playgroud)

所以,

import re
print ( re.sub( r'\D+', '', '1?????????0') )         # => 1?????????0
print ( re.sub( r'[^0-9]+', '', '1?????????0') )     # => 10
Run Code Online (Sandbox Code Playgroud)

  • 阿拉伯/印地语数字,不错;) (2认同)

Sco*_*ton 7

您可以使用.str.replace正则表达式:

dfObject['C'] = dfObject.C.str.replace(r"[a-zA-Z]",'')
Run Code Online (Sandbox Code Playgroud)

输出:

        A         B    C
1   red78    square  235
2   green    circle  123
3  blue45  triangle  657
Run Code Online (Sandbox Code Playgroud)

  • 关。此答案将删除所有字母数字字符。要删除所有非数字字符,请使用字符\ D。 (2认同)

jpp*_*jpp 5

你也可以通过一个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
Run Code Online (Sandbox Code Playgroud)