首页 > 解决方案 > 如何避免熊猫列中的数据类型不匹配

问题描述

我有一个可以从下面的代码生成的数据框

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类型

元素的数据类型如何与列的数据类型不同。我也在下面展示了

在此处输入图像描述

我怎么能期望我的输出如下所示

在此处输入图像描述

标签: pythonpython-3.xstringpandasdataframe

解决方案


使用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

推荐阅读