Gibt es überhaupt eine Möglichkeit, die Zuordnungsfunktion oder etwas Besseres zu verwenden, um Werte in einem gesamten Datenrahmen zu ersetzen?

Ich weiß nur, wie man das Mapping für Serien durchführt.

Ich möchte die Zeichenfolgen in den Spalten 'test' und 'set' durch eine Zahl ersetzen, zum Beispiel set = 1, test = 2

Hier ist ein Beispiel für meinen Datensatz: (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 Beratung,

34
jonas 14 Juni 2013 im 22:20

7 Antworten

Beste Antwort

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  

Wie @Jeff in den Kommentaren hervorhob, heften Sie in Pandas-Versionen <0.11.1 .convert_objects() manuell an das Ende, um tesst ordnungsgemäß zu konvertieren und auf int64 Spalten zu setzen, falls dies bei nachfolgenden Vorgängen von Bedeutung ist.

52
Zulan 3 Juni 2016 im 10:41

Sie können dies auch mit Pandas rename_categories tun. Sie müssten 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 benenne 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 diktatähnliches Objekt übergeben, um die Umbenennung abzubilden, z.

In [72]: s.cat.rename_categories({1: 'x', 2: 'y', 3: 'z'})
1
tsando 18 Mai 2018 im 14:13

Ich weiß, dass dies alt ist, aber für diejenigen, die suchen, 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 diese ausschreiben zu müssen.

21
Brandon 12 Okt. 2016 im 03:08

Wenn keine der Funktionen 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.
2
Akash Kandpal 2 Juni 2018 im 09:07

Sie können dazu die applymap DataFrame-Funktion 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
6
bdiamante 14 Juni 2013 im 18:38

Um Strings wie 'volvo', 'bmw' in Ganzzahlen zu konvertieren, konvertieren Sie sie zuerst in einen Datenrahmen und übergeben Sie sie dann an pandas.get_dummies ()

  df  = DataFrame.from_csv("myFile.csv")
  df_transform = pd.get_dummies( df )
  print( df_transform )

Bessere Alternative : Übergeben eines Wörterbuchs an map () einer Pandas-Serie (df.myCol) (durch Angabe der Spaltenmarke zum Beispiel)

df.brand = df.brand.map( {'volvo':0 , 'bmw':1, 'audi':2} )
1
Samer Ayoub 14 Sept. 2019 im 13:25

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

0
Chapo 30 Mai 2019 im 01:47