2016-05-09 27 views
7

我現在有一些數據集的結構如下:熊貓 - 如何分組和拆分多個變量?

data = {'participant': [100, 101, 102, 103, 104, 105, 106, 107, 108, 109], 
     'step_name': ['first', 'first', 'second', 'third', 'second', 'first', 'first', 'first', 'second', 'third'], 
     'title': ['acceptable', 'acceptable', 'not acceptable', 'acceptable', 'not acceptable', 'acceptable', 'not acceptable', 'acceptable', 'acceptable', 'acceptable'], 
     'colour': ['blue', 'blue', 'blue', 'green', 'green', 'blue', 'green', 'blue', 'blue', 'green'], 
     'class': ['A', 'B', 'B', 'A', 'B', 'A', 'A', 'A', 'A', 'B']} 
df = pd.DataFrame(data, columns=['participant', 'step_name', 'title', 'colour', 'class']) 

它看起來像:

+----+---------------+-------------+----------------+----------+---------+ 
| | participant | step_name | title   | colour | class | 
|----+---------------+-------------+----------------+----------+---------| 
| 0 |   100 | first  | acceptable  | blue  | A  | 
| 1 |   101 | first  | acceptable  | blue  | B  | 
| 2 |   102 | second  | not acceptable | blue  | B  | 
| 3 |   103 | third  | acceptable  | green | A  | 
| 4 |   104 | second  | not acceptable | green | B  | 
| 5 |   105 | first  | acceptable  | blue  | A  | 
| 6 |   106 | first  | not acceptable | green | A  | 
| 7 |   107 | first  | acceptable  | blue  | A  | 
| 8 |   108 | second  | acceptable  | blue  | A  | 
| 9 |   109 | third  | acceptable  | green | B  | 
+----+---------------+-------------+----------------+----------+---------+ 

現在我想使每一行計算每個重複的變量,對聚集的數據集,其我目前正在設法沿着兩個變量(step_nametitle)做如下:

count_df = df[['participant', 'step_name', 'title']].groupby(['step_name', 'title']).count() 
count_df = count_df.unstack() 
count_df.fillna(0, inplace=True) 
count_df.columns = count_df.columns.get_level_values(1) 
count_df 

+--------+--------------+------------------+ 
|  | acceptable | not acceptable | 
|--------+--------------+------------------| 
| first |   4 |    1 | 
| second |   1 |    2 | 
| third |   2 |    0 | 
+--------+--------------+------------------+ 

現在,我想要有一組額外的列,其中包含其他變量(colourclass)的值 - 基本上,我想對這些變量進行分組然後散堆,但不知道如何處理它有兩個以上的變量。最後,我想對我的決賽桌看起來像這樣:

+------+------+--------+--------------+------------------+ 
|class |colour| step | acceptable | not acceptable | 
|----------------------+--------------+------------------| 
| A | blue | first |   3 |    0 | 
| B | blue | first |   1 |    0 | 
| A |green | first |   0 |    1 | 
| B |green | first |   0 |    0 | 
| A | blue | second |   1 |    0 | 
| B | blue | second |   0 |    1 | 
| A |green | second |   0 |    0 | 
| B |green | second |   0 |    1 | 
| A |blue | third |   0 |    0 | 
| B |blue | third |   0 |    0 | 
| A |green | third |   1 |    0 | 
| B |green | third |   1 |    0 | 
+------+------+--------+--------------+------------------+ 

如何重塑我的數據,因此它看起來像我的最後一個例子?我仍然使用散堆和分組功能嗎?

回答

5

我認爲你需要pivot_tableaggfunc=lenreset_indexrename_axis(新中pandas0.18.0):

df = df.pivot_table(index=['class','colour','step_name'], 
        columns='title', 
        aggfunc=len, 
        values='participant', 
        fill_value=0).reset_index().rename_axis(None, axis=1) 
print df 
     class colour step_name acceptable not acceptable 
0   A blue  first   3    0 
1   A blue second   1    0 
2   A green  first   0    1 
3   A green  third   1    0 
4   B blue  first   1    0 
5   B blue second   0    1 
6   B green second   0    1 
7   B green  third   1    0 
+0

謝謝!看起來'rename_axis'位給我一個錯誤,但是'TypeError:必須通過一個索引來重命名' – orange1

+1

這是'pandas 0.18.0'中的新函數,你可以忽略它。並使用'df.columns.name = None' – jezrael

6

您可以使用pivot_table()此:

In [130]: df['count'] = 1 

In [134]: (df.pivot_table(index=['class','colour','step_name'], columns='title', 
    .....:     values='count', aggfunc='sum', fill_value=0) 
    .....: .reset_index() 
    .....:) 
Out[134]: 
title class colour step_name acceptable not acceptable 
0   A blue  first   3    0 
1   A blue second   1    0 
2   A green  first   0    1 
3   A green  third   1    0 
4   B blue  first   1    0 
5   B blue second   0    1 
6   B green second   0    1 
7   B green  third   1    0