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

Python 在具有各种数据类型的dataframe列中查找字符串中的数字,python,pandas,split,Python,Pandas,Split,我有一个数据帧(df): 我可以在里面找到数字: 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

我有一个数据帧(df):

我可以在里面找到数字:

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'

首先要注意的是,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

首先要注意的是,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
使用replace regex。 必须首先替换任何非字母数字的
[^\w]:''

然后替换字符串开头的任何非数字
“^\D+:”

最后用空格<代码> \d+':''/c>>/p>替换字符串中间的任何非数字。 使用空格拆分字符串以使其进入列表

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
使用replace regex。 必须首先替换任何非字母数字的
[^\w]:''

然后替换字符串开头的任何非数字
“^\D+:”

最后用空格<代码> \d+':''/c>>/p>替换字符串中间的任何非数字。 使用空格拆分字符串以使其进入列表

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