2016-03-19 65 views
0

pd.read_csvとStringIOを使用してデータフレームを作成したときに列をマッピングするときに問題があり、テキストの文字列をデータフレームに変換した後、特定の列を辞書にマッピングして、マップされるNaN値。なぜこれはそうですか?Python:StringIOの変換エラーがcsvデータフレームとpandasデータフレームを変換しましたか?

これに対して、私が直接作成したパンダのデータフレームからのものであれば、辞書を使って直接列をマップするとエラーは発生しませんでした。エラーがでてくるのはここ

はコードです:

import pandas as pd 
from io import StringIO 

df1 = unicode(''' 
green, M, 10.1, class1 
red, L, 13.5, class2 
blue, XL, 15.3, class1 
''') 

df1 = pd.read_csv(StringIO(df1), header = None) 

df1.columns = ['color', 'size', 'price', 'classlabel'] 

size_mapping = { 
    'XL':3, 
    'L': 2, 
    'M': 1, 
} 
df1['size'] = df1['size'].map(size_mapping) 
print df1 

戻り値この:この対

color size price classlabel 
0 green NaN 10.1  class1 
1 red NaN 13.5  class2 
2 blue NaN 15.3  class1 

:私はこれが代わりに返されます

import pandas as pd 
from io import StringIO 

df1 = pd.DataFrame([ 
    ['green', 'M', 10.1, 'class1'], 
    ['red', 'L', 13.5, 'class2'], 
    ['blue', 'XL', 15.3, 'class1'] 
    ]) 

df1.columns = ['color', 'size', 'price', 'classlabel'] 

size_mapping = { 
    'XL':3, 
    'L': 2, 
    'M': 1, 
} 
df1['size'] = df1['size'].map(size_mapping) 
print df1 

color size price classlabel 
0 green  1 10.1  class1 
1 red  2 13.5  class2 
2 blue  3 15.3  class1 

なぜ私はユニコードファイルから読み込んだものを変換しようとすると違いがありますか?

答えて

1

あなたは、文字列由来のデータフレームから個々の値を検査した場合、なぜあなたは見ることができます:

>>> df1['size'].iloc[0] 
' M' 

先頭のスペースに注意してください。 DataFrameの値が"M"、 "L"、および"XL"ではないため、マッピングが機能しません。それらは" M"," L"および" XL"である。

CSVファイルには、コンマの後にスペースを含めないでください。そのようなスペースはデータの一部とみなされます。カンマの後のスペースを削除するように文字列を再フォーマットすると、正常に動作します。

関連する問題