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,它将正常工作。
我意识到在使用 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,它将正常工作。