2016-02-17 3 views
1

Я играю вокруг некоторого машинного обучения по набору данных. Я довольно новичок в pandas/numpy в python. Так что я не могу определить решение. У меня есть dataframe, полученный функцией read_csv с использованием pandas. Dataframe аналогично, как показано нижеКак изменить форму данных в пандах?

ID ATTR QUANTITY 
17 203  14 
17 201  8 
17 111  1 
159 80  5 
178 82  16 

и я хочу это dataframe быть изменена/сплющенные, как:

ID | attr1 | attr2 | attr3 | totalQuantity..................goes on 
=========================================================== 
    17 | 203 | 201 | 111 | 23 (i.e sum where id == 17) 
    159 | 80 | 0 | 0 | 5 
    178 | 82 | 0 | 0 | 16 
    .... 

Кусок кода высоко оценили. Заранее спасибо

+0

попробовать закодировать немного, будет лучше. –

ответ

2

Сначала создайте столбец att для pivotting по cumcount Затем используйте pivot для df1 и groupby с sum для df2. Последний mergedf1 с df2 и fillna по 0:

print df 
    ID ATTR QUANTITY 
0 17 203  14 
1 17 201   8 
2 17 111   1 
3 17 203  14 
4 17 201   8 
5 17 111   1 
6 17 203  14 
7 17 201   8 
8 17 111   1 
9 17 203  14 
10 17 201   8 
11 17 111   1 
12 159 80   5 
13 178 82  16 

#add column att for counting groups items 
df['att'] = df.groupby('ID')['ID'].cumcount() + 1 
#pivot df with column att 
df1 = df.pivot(index='ID', columns='att', values='ATTR').reset_index() 
#add string 'attr' to columns names 
df1.columns = [df1.columns[0]] + ['attr' + str(col) for col in df1.columns[1:]] 
df2 = df.groupby('ID')['QUANTITY'].sum().reset_index() 
#merge with sum 
print pd.merge(df1, df2 , on=['ID']).fillna(0) 
ID attr1 attr2 attr3 attr4 attr5 attr6 attr7 attr8 attr9 attr10 \ 
0 17 203 201 111 203 201 111 203 201 111  203 
1 159  80  0  0  0  0  0  0  0  0  0 
2 178  82  0  0  0  0  0  0  0  0  0 

    attr11 attr12 QUANTITY 
0  201  111  92 
1  0  0   5 
2  0  0  16 
+0

Большое спасибо за ответ. Кажется, работает частично, хотя. Его создание столбцов и заполнение их значениями, но я не знаю, почему порядок создания столбцов немного странный. – 911Rapid

+0

Следующий порядок: Индекс ([u'id ', u'attr1', u'attr10 ', u'attr11', u'attr12 ', u'attr13', u'attr14 ', u'attr15', u 'attr16', u'attr17 ', u'attr18', u'attr19 ', u'attr2', u'attr20 ', u'attr3', u'attr4 ', u'attr5', u'attr6 ', u 'attr7', u'attr8 ', u'attr9'], dtype = 'object') – 911Rapid

+0

У меня около 50 тыс. строк в наборе данных, и функция занимает около 1 минуты для выполнения. Кстати, что я должен проверить? Я вижу, что код такой же, как раньше. – 911Rapid

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