2017-11-14 1 views
0

Ich habe eine Pandas DataFrame mit vielen "Objekt" Spalten, wo jeder von ihnen viele Werte (Modalitäten) enthält. Dann möchte ich nur die 10 häufigsten Modalitäten für jede Spalte behalten und die anderen durch 'Oth' ersetzen.Pandas: Ersetzen Sie mehrere Spaltenwerte durch eindeutigen Wert

Zum Beispiel, wenn ich eine Spalte ‚obj_col1‘, die 4 verschiedene Werte enthält:

obj_col1 
'A' 
'A' 
'B' 
'C' 
'B' 
'D' 

und ich möchte 2 halten, die am häufigsten, hier ‚A‘ und ‚B‘, und ersetzen die Rest durch 'Oth':

obj_col2 
'A' 
'A' 
'B' 
'Oth' 
'B' 
'Oth' 

ein Stück Code für eine Objektspalte (kategorische Variable) ist:

# sorted list of modalities of 'categ_var' 
list_freq_modal = df['categ_var'].value_counts().index.tolist() 
# replace all the modalities except the first 10 by 'Oth' 
df['categ_var'].replace(list_freq_modal[10:],'Oth', inplace=True) 

Aber I hav e ein Fehler: 'NoneType' Objekt hat kein Attribut 'any'

Haben Sie eine Idee, haben Sie es in optimaler Weise implementieren?

+0

Beispieldaten bitte – Dark

+0

Es scheint, Es gibt einige 'None' oder' NaN' Werte – jezrael

Antwort

1

Statt ersetzen wir value_counts.head(2) und where durch Mapping value_counts und bekommen die Maske mit notnull() dh

x = df['obj_col1'].value_counts().head(2) 
#B 2 
#A 2 
#Name: obj_col1, dtype: int64 

df['obj_col1'].where(df['obj_col1'].map(x).notnull(),'Oth') 

Ausgabe verwenden:

 
0  A 
1  A 
2  B 
3 Oth 
4  B 
5 Oth 
Name: obj_col1, dtype: object 
df['obj_col1'].map(x).notnull() # This will give the mask. 
 
0  True 
1  True 
2  True 
3 False 
4  True 
5 False 
Name: obj_col1, dtype: bool 
Verwandte Themen