2016-08-23 5 views
0

новых для панды Я хочу, чтобы выполнить что-то похожее на Reduce number of levels for large categorical variables (биннинг категориальных переменных для того, чтобы уменьшить их уровни) штрафа в RПанды уменьшить количество категориальных переменных

DTsetlvls <- function(x, newl) 
    setattr(x, "levels", c(setdiff(levels(x), newl), rep("other", length(newl)))) 

Моего dataframe Следующий код работает:

df = pd.DataFrame({'Color': 'Red Red Blue'.split(), 
        'Value': [100, 150, 50]}) 

df['Counts'] = df.groupby('Color')['Value'].transform('count') 
print (df) 

    Color Value Counts 
0 Red 100  2 
1 Red 150  2 
2 Blue  50  1 

я вручную создал бы агрегатный столбец, а затем, основываясь на том, что маркировать реже группы например, «синий» как единая «другая» группа. Но по сравнению с кратким R-кодом это кажется неуклюжим. Какой был бы правильный подход здесь?

+0

Возможные дублировать [Как группировать «оставшиеся» результаты за пределами Top N в «O thers "с пандами] (http://stackoverflow.com/questions/19835746/how-to-group-remaining-results-beyond-top-n-into-others-with-pandas) –

ответ

1

Я думаю, что вы можете использовать value_counts с numpy.where, где состояние с isin:

df = pd.DataFrame({'Color':'Red Red Blue Red Violet Blue'.split(), 
        'Value':[11,150,50,30,10,40]}) 
print (df) 
    Color Value 
0  Red  11 
1  Red 150 
2 Blue  50 
3  Red  30 
4 Violet  10 
5 Blue  40 

a = df.Color.value_counts() 
print (a) 
Red  3 
Blue  2 
Violet 1 
Name: Color, dtype: int64 

#get top 2 values of index 
vals = a[:2].index 
print (vals) 
Index(['Red', 'Blue'], dtype='object') 

df['new'] = np.where(df.Color.isin(vals), 0,1) 
print (df) 
    Color Value new 
0  Red  11 0 
1  Red 150 0 
2 Blue  50 0 
3  Red  30 0 
4 Violet  10 1 
5 Blue  40 0 

Или, если нужно заменить все не главные ценности использования where:

df['new1'] = df.Color.where(df.Color.isin(vals), 'other') 
print (df) 
    Color Value new1 
0  Red  11 Red 
1  Red 150 Red 
2 Blue  50 Blue 
3  Red  30 Red 
4 Violet  10 other 
5 Blue  40 Blue 
Смежные вопросы