it-swarm.com.de

python-Pandas, die Zeichenfolgen in Datenrahmen durch Zahlen ersetzen

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,

25
jonas

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.

38
Dan Allan

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.

16
Brandon

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
4
bdiamante

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 )
2
Samer Ayoub

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.
0
Akash Kandpal

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'})
0
tsando

df.replace(to_replace=['set', 'test'], value=[1, 2]) von @Ishnark Kommentar zur akzeptierten Antwort.

0
Chapo