2015-04-28 2 views
0

Давайте предположим, что у меня есть кадр данных:панды: замена категориальные значения с отсчетами нескольких классов этикетки

df = pd.DataFrame({'label': [0, 1, 2, 0, 1, 2], 'cat_col': [1, 1, 2, 2, 3, 3]}) 
    cat_col label 
0  1  0 
1  1  1 
2  2  2 
3  2  0 
4  3  1 
5  3  2 

Я хочу, чтобы преобразовать этот кадр данных в следующем:

cat_col, label, count_when_label_is_0, count_when_label_is_1, count_when_label_is_2 
1   0   1,    1,   0 
1   1   1,    1,   0 
... 

Поэтому в основном я добавьте один столбец для каждого значения метки (многотомная метка), и для каждой строки я поместил счетчик для этого значения метки, когда row.cat_col - это то, что находится в этой строке. Сейчас у меня это, но это очень медленно:

size = df[['cat_col', 'label']].groupby(['cat_col', 'label']).size() 
def get_size(cat_val, label_val): 
    if label_val in size[cat_val]: return size[cat_val][target_val] 
    return 0 

for label_val in range(9): # 9 classes in multinominal label 
    df['new_col_' + str(label_val)] = df['cat_col'].apply(
     lambda cat_val: get_size(cat_val, label_val)) 

ответ

0

Вы можете использовать pivot_table:

In [11]: df.pivot_table(index="cat_col", columns="label", aggfunc=len, fill_value=0) 
Out[11]: 
label 0 1 2 
cat_col 
1  1 1 0 
2  1 0 1 
3  0 1 1 
+0

в то время как это отличается от ФОС, делая это как tranform (на cat_col) кажется очень странным. .. –

Смежные вопросы