Python:StringIO 转换的 csv 数据帧与 pandas 数据帧的映射错误?

Python: Mapping error for a StringIO converted csv dataframe versus pandas data frame?

我意识到在使用 pd.read_csv 和 StringIO 创建数据框时映射列存在问题,将文本字符串转换为数据框,然后使用字典映射特定列,因为列将给我映射的所有 NaN 值。为什么会这样?

相比之下,如果列来自我直接创建的 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

Returns这个:

   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 文件中读取的内容时,为什么会有差异?

如果您从字符串派生的 DataFrame 中检查单个值,您就会明白为什么:

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

注意前导 space。您的映射不起作用,因为您的 DataFrame 中的值不是 "M"、"L" 和 "XL";它们是 " M"" L"" XL"

CSV 文件不应在逗号后包含 space;这样的 space 将被视为数据的一部分。如果您重新格式化字符串以删除逗号后的 spaces,它将正常工作。