2017-11-08 20 views
1

データフレーム(pandas.read_sasを使用してSASファイルからインポートしたもの)があります.1つのカラムがバイトオブジェクトで、他の時が単なる文字列です。私のコードでは、すなわちPython pandas - オブジェクトがバイトオブジェクトであるかどうかを調べる

>>> 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値を取得します。

バイトオブジェクトであるかどうかを確認する方法はありますか?残念ながら、両方のケースが発生することがあります。

もう1つの解決策は、データフレームをエクスポートするときに、このタイプをデコードせずに保持し、エンコードすることです。

df1.to_csv(test.csv,index=False,encoding='utf-8') 

しかし、上記のうちの最初のものは機能しません。次に、エンコードが必要かどうかを確認する必要があります。

答えて

1

タイプを適用して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とよく似ています。

関連する問題