Gibt es sowieso die Mapping-Funktion oder etwas besser, um Werte in einem gesamten Datenrahmen zu ersetzen?
Ich kann nur das Mapping seriell durchführen.
Ich möchte die Zeichenfolgen in der Spalte 'tesst' und 'set' durch eine Zahl .__ ersetzen. Beispiel: set = 1, test = 2
Hier ist ein Beispiel meines Datensatzes: (Originaldatensatz ist sehr groß)
ds_r
respondent brand engine country aware aware_2 aware_3 age tesst set
0 a volvo p swe 1 0 1 23 set set
1 b volvo None swe 0 0 1 45 set set
2 c bmw p us 0 0 1 56 test test
3 d bmw p us 0 1 1 43 test test
4 e bmw d germany 1 0 1 34 set set
5 f audi d germany 1 0 1 59 set set
6 g volvo d swe 1 0 0 65 test set
7 h audi d swe 1 0 0 78 test set
8 i volvo d us 1 1 1 32 set set
Endergebnis sollte sein
ds_r
respondent brand engine country aware aware_2 aware_3 age tesst set
0 a volvo p swe 1 0 1 23 1 1
1 b volvo None swe 0 0 1 45 1 1
2 c bmw p us 0 0 1 56 2 2
3 d bmw p us 0 1 1 43 2 2
4 e bmw d germany 1 0 1 34 1 1
5 f audi d germany 1 0 1 59 1 1
6 g volvo d swe 1 0 0 65 2 1
7 h audi d swe 1 0 0 78 2 1
8 i volvo d us 1 1 1 32 1 1
dankbar für beraten,
Was ist mit DataFrame.replace
?
In [9]: mapping = {'set': 1, 'test': 2}
In [10]: df.replace({'set': mapping, 'tesst': mapping})
Out[10]:
Unnamed: 0 respondent brand engine country aware aware_2 aware_3 age \
0 0 a volvo p swe 1 0 1 23
1 1 b volvo None swe 0 0 1 45
2 2 c bmw p us 0 0 1 56
3 3 d bmw p us 0 1 1 43
4 4 e bmw d germany 1 0 1 34
5 5 f audi d germany 1 0 1 59
6 6 g volvo d swe 1 0 0 65
7 7 h audi d swe 1 0 0 78
8 8 i volvo d us 1 1 1 32
tesst set
0 2 1
1 1 2
2 2 1
3 1 2
4 2 1
5 1 2
6 2 1
7 1 2
8 2 1
@Jeff wies in den Kommentaren darauf hin, dass in pandas-Versionen <0.11.1 .convert_objects()
manuell am Ende angeheftet wird, um tesst ordnungsgemäß zu konvertieren und auf int64
-Spalten zu setzen, falls dies in nachfolgenden Vorgängen wichtig ist.
Ich weiß, das ist alt, aber für diejenigen, die suchen, so viel wie ich war. Erstellen Sie einen Datenrahmen in Pandas, df in diesem Code
ip_addresses = df.source_ip.unique()
ip_dict = dict(Zip(ip_addresses, range(len(ip_addresses))))
Dadurch erhalten Sie eine Wörterbuchzuordnung der IP-Adressen, ohne sie ausschreiben zu müssen.
Sie können dazu die Funktion applymap
DataFrame verwenden:
In [26]: df = DataFrame({"A": [1,2,3,4,5], "B": ['a','b','c','d','e'],
"C": ['b','a','c','c','d'], "D": ['a','c',7,9,2]})
In [27]: df
Out[27]:
A B C D
0 1 a b a
1 2 b a c
2 3 c c 7
3 4 d c 9
4 5 e d 2
In [28]: mymap = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
In [29]: df.applymap(lambda s: mymap.get(s) if s in mymap else s)
Out[29]:
A B C D
0 1 1 2 1
1 2 2 1 3
2 3 3 3 7
3 4 4 3 9
4 5 5 4 2
Um Strings wie 'volvo' und 'bmw' in Ganzzahlen zu konvertieren, konvertieren Sie sie zuerst in einen Datenrahmen und übergeben Sie ihn dann an pandas.get_dummies ().
df = DataFrame.from_csv("myFile.csv")
df_transform = pd.get_dummies( df )
print( df_transform )
Wenn keine Features nicht viel sind:
mymap = {'a':1, 'b':2, 'c':3, 'd':4, 'e':5}
df.applymap(lambda s: mymap.get(s) if s in mymap else s)
Wenn es nicht manuell möglich ist:
temp_df2 = pd.DataFrame({'data': data.data.unique(), 'data_new':range(len(data.data.unique()))})# create a temporary dataframe
data = data.merge(temp_df2, on='data', how='left')# Now merge it by assigning different values to different strings.
Sie können dies auch mit Pandas rename_categories
tun. Sie müssen zuerst die Spalte als dtype="category"
definieren, z.
In [66]: s = pd.Series(["a","b","c","a"], dtype="category")
In [67]: s
Out[67]:
0 a
1 b
2 c
3 a
dtype: category
Categories (3, object): [a, b, c]
und benennen Sie sie dann um:
In [70]: s.cat.rename_categories([1,2,3])
Out[70]:
0 1
1 2
2 3
3 1
dtype: category
Categories (3, int64): [1, 2, 3]
Sie können auch ein dict-like-Objekt übergeben, um die Umbenennung abzubilden, z. B .:
In [72]: s.cat.rename_categories({1: 'x', 2: 'y', 3: 'z'})
df.replace(to_replace=['set', 'test'], value=[1, 2])
von @Ishnark Kommentar zur akzeptierten Antwort.