Python pandas - 检查对象是否是字节对象

时间:2017-11-08 10:00:02

标签: python-3.x pandas object

我有一个数据帧(使用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')

但是,首先上面的工作没有用,第二我想我仍然需要检查是否需要编码。

1 个答案:

答案 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非常相似的maskdf.where进行此操作。