2016-03-24 2 views
0

У меня есть панды DataFrame следующим образом, около 1k различных значений в категории:Каков наилучший способ создания новых столбцов на основе значения существующего столбца Pandas dataframe в Python?

Category  Value  
     a   0.1   
     b   1   
     c   100   
     d   20   
     a   0.5   

Что я ожидаю:

  1. разделить числовой столбец «Value» в N полос частот между минимальным и максимальные значения: для случая выше, пусть Nbands = 10, они составляют 0,1-10, 10-20, 20-30, ..., 90-100.

  2. создавать новые столбцы, основанные на комбинациях Category_ValueBands и суммировать значение:

То есть:

Category  Value   a_1 a_2 ... a_10 ... d_10 
     a   0.1   0.6  ...  ...  ... 
     b   1    0 
     c   100   0 
     d   20   0 
     a   0.5   0.6    ...  0 

Что такое лучший способ сделать это с помощью N полос для численного столбца «Значение» и значения категориального столбца «Категория»?

+0

вам нужно сохранить первоначальную структуру ф.р.? вы можете сделать это с помощью группы довольно легко, если просто хотите подсчеты. – dmb

+0

Да, я хочу сохранить исходную структуру df – Osiris

ответ

1

Вы можете использовать oneHotEncoder в scikit-learn.

Но если вы хотите сделать это непосредственно, может быть что-то вроде этого ...

загрузить данные в dataframe

import numpy as np 
import pandas as pd 
x = pd.read_csv('testData.csv') 

Создать новую седловины с требуемыми значениями ... вы будете позже взорвать их вне в ваших новые имена столбцов, но теперь они значение ... «A_0», «a_1» и т.д.

newCol_1 = x.Category.values 
newCol_2 = (x.Value/10).astype(int).astype(str).values 
x['newCol'] = newCol_1 + '_' + newCol_2 

создает новый столбец с суммами ваших значений.

newVals = x.ix[:, ['newCol', 'Value']].groupby('newCol').agg(np.sum)  # counts 
newVals.columns = ['newVals']            # change column names 
x = pd.merge(x, newVals, how='left', left_on='newCol', right_index=True) # merge with df 


x.ix[:,['newCol', 'newVals']] 
Out[54]: 
    newCol newVals 
0 a_0  0.6 
1 b_0  1.0 
2 c_10 100.0 
3 d_2  20.0 
4 a_0  0.6 

распространение «NEWCOL» из одной колонки в каждой категории ...

for col in np.unique(x.newCol): 
    x[col] = 0.0 
    idx = (x.newCol == col) 
    x.ix[idx, col] = x.newVals[idx] 


x 
Out[56]: 
    Category Value Count newCol newVals a_0 b_0 c_10 d_2 
0  a 0.1  2 a_0  0.6 0.6 0  0 0 
1  b 1.0  3 b_0  1.0 0.0 1  0 0 
2  c 100.0  1 c_10 100.0 0.0 0 100 0 
3  d 20.0  4 d_2  20.0 0.0 0  0 20 
4  a 0.5  5 a_0  0.6 0.6 0  0 0 
Смежные вопросы