python - 如何避免熊猫列中的数据类型不匹配
问题描述
我有一个可以从下面的代码生成的数据框
df = pd.DataFrame({'person_id' :['13423523234527afefc9586e8cec5ae2e5c5d46aedcbe6a5652fa0615e92c3ee84bc32792826','123253252364334527afefc9586e8cec536ae2e5c5d46aedcbe6a5652fa0615e92c3ee84bc32792826','123443643643527afefc9586e8cec5346ae2e5c5d46aedcbe6a5652fa0615e92c3ee84bc32792826','1234523463434312de3c1a186a623642a6699bb2f5ab570c37985ec13ed33582486b51aa1234567','123452312de3c1a186a622a6693469bb2f5ab570c37985ec13ed33554321b51aa8891808','1234523146363462de3c1a186a622a3466699bb2f5ab570c37985ec13ed331234551aa8891808','123452312de3c143643a186a622a6699634bb2f5ab570c37985ec13ed12345676b51aa8891808',np.nan,2],'level_1': ['L1FR','L1Date','L1value','L1FR','L1Date','L1value','L2FR','L2Date','L2value'], 'val3':['Fasting','11/4/2005',1.33,'Random','18/1/2007',4.63,'Fasting','18/1/2017',8.63]})
如下图所示
我想从person_id
列中提取数字部分(只有 9 位)。为此我尝试了以下
df.fillna(0,inplace=True)
df.person_id.apply(lambda x: int(''.join(filter(str.isdigit, str(x)))))
在上面的代码中,如果我不使用str(x)
,它会抛出一个错误,因为元素0
( 7th row after filling na
) 和2
( 8th row
) 是integer
类型
元素的数据类型如何与列的数据类型不同。我也在下面展示了
我怎么能期望我的输出如下所示
解决方案
使用pandas.Series.str.findall
:
df.fillna(0, inplace=True)
df['person_id'] = df['person_id'].astype(str)
df['extracted'] = df['person_id'].str.findall('\d+').apply(lambda x: ''.join(x)[:9])
print(df['extracted'])
输出:
0 123452795
1 123452795
2 123452795
3 123452312
4 123452312
5 123452312
6 123452312
7 0
8 2
Name: extracted, dtype: object
推荐阅读
- vue.js - 如何在 Vuetify 中关闭 Google 字体和 Material Design 图标
- string - Integer'Value("X") 在 Ada 中的实现
- sql - Oracle SQL Developer - 引用嵌套 from 语句中的字段时出错
- java - 为具有无界泛型的同质集合编写自定义反序列化器
- laravel - Laravel 电商项目使用 Aimeos 包
- c# - 如何通过用户输入使 DateTimePicker 不可编辑
- ios - 传输到 Apple M1 Xcode 显示错误“找不到‘FirebaseCore/FirebaseCore.h’文件”和“无法构建 Objective-C 模块‘Firebase’”
- javascript - useEffect 清理功能
- c# - 将发布配置文件 (.xml) 转换为 DacDeployOptions 类
- python - 为什么 XPath 计算错误的子字符串数量?