2016-03-19 12 views
0

Ich erkannte, dass es ein Problem mit der Zuordnung einer Spalte beim Erstellen eines Datenrahmens mit der pd.read_csv und StringIO, um eine Zeichenfolge in einen Datenrahmen zu konvertieren dann eine bestimmte Spalte mit einem Wörterbuch zuordnen, da die Spalte mir alles geben wird NaN-Werte, die zugeordnet sind. Warum ist das so?Python: Mapping-Fehler für eine StringIO konvertiert CSV-Datenrahmen im Vergleich zu Pandas Datenrahmen?

Im Gegensatz dazu habe ich keinen Fehler festgestellt, wenn ich die Spalte direkt mit einem Wörterbuch abbilde, wenn die Spalte von einem Pandas-Datenframe stammt, den ich direkt erstellt habe. Hier

ist der Code, wo der Fehler kommt in:

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 this:

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

Versus dies:

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 

Wo ich diese stattdessen zurück zu bekommen:

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

Warum gibt es einen Unterschied, wenn ich versuche, das, was ich aus einer Unicode-Datei gelesen habe, zu konvertieren?

Antwort

1

können Sie sehen, warum, wenn Sie inspizieren einen individuellen Wert aus dem String abgeleiteten Datenrahmen:

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

Hinweis der führende Raum. Ihre Zuordnung funktioniert nicht, da die Werte in Ihrem Datenrahmen nicht "M", "L" und "XL" sind; sie sind " M", " L" und " XL".

CSV-Dateien sollten keine Leerzeichen nach den Kommas enthalten; Solche Räume werden als Teil der Daten betrachtet. Wenn Sie die Zeichenfolge neu formatieren, um die Leerzeichen nach den Kommas zu entfernen, funktioniert das problemlos.

Verwandte Themen