我有一个数据框(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'
答案 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