我有一个数据帧(使用pandas.read_sas从SAS文件导入),其中一列有时是字节对象,其他时间只是一个字符串。
即。
>>> df1
barcode
0 b'346546'
1 b'645542'
2 b'486465'
3 b'135455'
4 b'465482'
5 b'132456'
>>> df2
barcode
0 346546
1 645542
2 486465
3 135455
4 465482
5 132456
在我的代码中,当我使用
时df1.loc[:,'barcode']=df1['barcode'].str.decode('utf-8')
它有效,但是当我使用
时df2.loc[:,'barcode']=df2['barcode'].str.decode('utf-8')
我得到了NaN值。
有没有办法检查它是否是一个字节对象?不幸的是,两种情况都可能发生。
另一种解决方案是在导出数据帧时保持此类型而不进行解码和编码。
df1.to_csv(test.csv,index=False,encoding='utf-8')
但是,首先上面的工作没有用,第二我想我仍然需要检查是否需要编码。
答案 0 :(得分:2)
您可以通过应用类型和检查condtion来使用where,因此可以完成解码的条件应用。即
示例:
df = pd.DataFrame({'barcode':[b'346546',b'645542',b'486465',b'135455',15200,15200]})
df['barcode'] = df['barcode'].where(df['barcode'].apply(type) != bytes, df['barcode'].str.decode('utf-8'))
输出:
barcode 0 346546 1 645542 2 486465 3 135455 4 15200 5 15200
df['barcode'].apply(type) != bytes # This gives a booelan mask
0 False 1 False 2 False 3 False 4 True 5 True Name: barcode, dtype: bool
df.where
获取错误值并替换为新解码的字符串。
您还可以使用与此np.where
非常相似的mask
,df.where
进行此操作。