2016-03-19 1 views
0

Я понял, что есть проблема с сопоставлением столбца, когда я создал фрейм данных с использованием pd.read_csv и StringIO, чтобы преобразовать строку текста в dataframe, а затем сопоставить определенный столбец со словарем, поскольку столбец даст мне все NaN, которые отображаются. Почему это так?Python: ошибка сопоставления для преобразованного в StringIO csv dataframe и кадра данных pandas?

Напротив, у меня не возникла ошибка, когда я напрямую сопоставляю столбец со словарем, если столбец связан с файловым файлом 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 

Почему существует разница, когда я пытаюсь преобразовать то, что я читаю из файла Unicode?

ответ

1

Вы можете понять, почему, если вы проверяете отдельное значение из вашей строки полученных DataFrame:

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

Примечания лидирующего пространства. Ваше сопоставление не работает, потому что значения в вашем DataFrame не являются "M", «L» и "XL"; это " M", " L" и " XL".

Файлы CSV не должны содержать пробелов после запятых; такие пространства будут считаться частью данных. Если вы переформатируете свою строку, чтобы удалить пробелы после запятых, она будет работать нормально.

Смежные вопросы