2017-11-14 9 views
0

私は多くの値(モダリティ)を含む多くの「オブジェクト」列を持つpandas DataFrameを持っています。次に、私はの10個の最も頻繁なモダリティを各列に対してだけ残し、残りは 'Oth'で置き換えたいと考えています。例えばパンダ:複数の列の値を一意の値で置き換えます。

、私は列の4つの異なる値が含まれている「obj_col1」を持つ場合:

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

をし、私が最も頻繁に、ここでは「A」と「B」の2を維持し、交換したいです'0番目' によって残り:

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

つのオブジェクト列(カテゴリ変数)のためのコードの一部である:

# 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) 

しかし、私は肝炎エラー: 'NoneType'オブジェクトに 'any'属性がありません

もっと最適な方法で実装してもらえますか?

+0

サンプル・データください – Dark

+0

それはそうですいくつかの 'None'または' NaN'値があります – jezrael

答えて

1

の代わりに、我々はマッピングvalue_countsによってvalue_counts.head(2)whereを使用してnotnull()

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') 

すなわち出力とマスクを取得することができます置き換える:

 
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 
関連する問題