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