在具有各种数据类型的数据框列中查找字符串中的数字

时间:2020-10-28 20:08:53

标签: python pandas split

我有一个数据框(df):

df = pd.DataFrame({'A' : ['it is 54321', 'it is 54322']})

我可以在其中找到数字

df['B'] = df['A'].apply(lambda str:[int(s) for s in str.split() if s.isdigit()])

但是当数据类型多种多样时:

df = pd.DataFrame({'A' : [54321, 'it is 54322', 'is it 54323 or 4?', np.NaN]})

我得到:

AttributeError: 'int' object has no attribute 'split'

2 个答案:

答案 0 :(得分:1)

首先要注意的str是Python关键字,请避免将其用作变量。

现在,要解决您的问题,您可以使用isinstance检查单元格是否为字符串:

df['B'] = df['A'].apply(lambda x:[int(s) for s in x.split() if s.isdigit()]
                                 if isinstance(x,str) else x)

输出:

                   A        B
0              54321    54321
1        it is 54322  [54322]
2  is it 54323 or 4?  [54323]
3                NaN      NaN

答案 1 :(得分:1)

使用替换正则表达式。 必须首先替换任何非字母数字的[^\w]':''

然后替换字符串'^\D+':''开头的所有非数字

最后用空格'\D+':' '替换字符串中间的所有非数字

使用空格分割字符串以使其列出

df['B']= df.A.replace(regex={'[^\w]':'','^\D+':'','\D+':' '}).str.split('\s')



              A           B
0              54321         NaN
1        it is 54322     [54322]
2  is it 54323 or 4?  [54323, 4]
3                NaN         NaN