2017-09-07 105 views
1

我試圖用這樣的數據框(抱歉的格式,我在手機上打字):樞紐和計數條件

'Date'     'Color' 'Jar' 
0 '05-10-2017' 'Red'  1 
1 '05-10-2017' 'Green'  2 
2 '05-10-2017' 'Blue'  1 
3 '05-10-2017' 'Red'  2 
4 '05-10-2017' 'Blue'  1 
5 '05-11-2017' 'Red'  2 
6 '05-11-2017' 'Green'  1 
7 '05-11-2017' 'Red'  2 
8 '05-11-2017' 'Green'  1 
9 '05-11-2017' 'Blue'  1 
10 '05-11-2017' 'Blue'  2 
11 '05-11-2017' 'Red'  2 
12 '05-11-2017' 'Blue'  2 
13 '05-11-2017' 'Blue'  1 
14 '05-12-2017' 'Green'  2 
15 '05-12-2017' 'Blue'  1 
16 '05-12-2017' 'Red'  1 
17 '05-12-2017' 'Blue'  2 
18 '05-12-2017' 'Blue'  2 

,並獲得一個看起來像一個在下面,列中填充了每個日期的實例數。

Date.      Jar 1 Red Jar 2 Red Jar 1 Green Jar 2 Green Jar 1 Blue Jar 2 Blue 
05-10-2017 
05-11-2017 
05-12-2017 

我是想爲了做到這一點使用GROUPBY和能夠得到各種顏色的計數每一天,但我不能確定如何去分割,通過該罐,他們來到顏色列從。我也讀過那個查詢或loc可能下注選項來完成這個。任何方向將不勝感激。

+2

首先,WOW在手機上...... –

+0

我花了很長時間的午餐;) –

+0

如果您的問題已被回答,您可以[接受最有幫助的](https://stackoverflow.com/help/有人-答案)。 –

回答

1

讓我們試試這個:

df_out = df.assign(count=1).pivot_table(index='Date',columns=['Jar','Color'], values='count',aggfunc='sum', fill_value=0) 

df_out.columns = df_out.columns.map('{0[0]} {0[1]}'.format) 

df_out.add_prefix('Jar ') 

輸出:

  Jar 1 Blue Jar 1 Green Jar 1 Red Jar 2 Blue Jar 2 Green \ 
Date                  
05-10-2017   2   0   1   0   1 
05-11-2017   2   2   0   2   0 
05-12-2017   1   0   1   2   1 

      Jar 2 Red 
Date     
05-10-2017   1 
05-11-2017   3 
05-12-2017   0 
+1

這工作完美!現在,教自己在這裏發生了什麼。乾杯! –

1

選項1

pd.crosstab

df1 

      Date Color Jar 
0 05-10-2017 Red 1 
1 05-10-2017 Green 2 
2 05-10-2017 Blue 1 
3 05-10-2017 Red 2 
4 05-10-2017 Blue 1 
5 05-11-2017 Red 2 
6 05-11-2017 Green 1 
7 05-11-2017 Red 2 
8 05-11-2017 Green 1 
9 05-11-2017 Blue 1 
10 05-11-2017 Blue 2 
11 05-11-2017 Red 2 
12 05-11-2017 Blue 2 
13 05-11-2017 Blue 1 
14 05-12-2017 Green 2 
15 05-12-2017 Blue 1 
16 05-12-2017 Red 1 
17 05-12-2017 Blue 2 
18 05-12-2017 Blue 2 

df1 = pd.crosstab(df2.Date, [df2.Jar, df2.Color]) 
df1.columns = df1.columns.map('{0[0]} {0[1]}'.format) # borrowed this line from https://stackoverflow.com/a/46102413/4909087 
df1 = df1.add_prefix('Jar ') 
df1 

      Jar 1 Blue Jar 1 Green Jar 1 Red Jar 2 Blue Jar 2 Green \ 
Date                  
05-10-2017   2   0   1   0   1 
05-11-2017   2   2   0   2   0 
05-12-2017   1   0   1   2   1 

      Jar 2 Red 
Date     
05-10-2017   1 
05-11-2017   3 
05-12-2017   

選項2

pd.get_dummiesdf.groupby

df1 = df1.set_index('Date') 
df1 = pd.get_dummies(df1.Jar.astype(str).str.cat(df1.Color, sep=' '))\ 
           .add_prefix('Jar ').groupby(level=0).sum() 
df1 

      Jar 1 Blue Jar 1 Green Jar 1 Red Jar 2 Blue Jar 2 Green \ 
Date                  
05-10-2017   2   0   1   0   1 
05-11-2017   2   2   0   2   0 
05-12-2017   1   0   1   2   1 

      Jar 2 Red 
Date     
05-10-2017   1 
05-11-2017   3 
05-12-2017   0 

性能

100 loops, best of 3: 13.4 ms per loop # pivot_table 
100 loops, best of 3: 9.05 ms per loop # stacking, grouping, unstacking 
100 loops, best of 3: 10.4 ms per loop # crosstab 
100 loops, best of 3: 3.57 ms per loop # get_dummies 

大(df * 10000

10 loops, best of 3: 42.8 ms per loop # pivot_table 
1 loop, best of 3: 913 ms per loop # stacking, grouping, unstacking 
10 loops, best of 3: 43.1 ms per loop # crosstab 
1 loop, best of 3: 885 ms per loop # get_dummies 

你想用什麼取決於你的數據。

1

或者你可以試試這個

df=df.set_index(['Date','Color']).stack().reset_index() 
df['Columns']=df['level_2']+' '+df[0].astype(str)+' '+df['Color'] 
df.groupby(['Date','Columns']).size().unstack().fillna(0) 

Out[239]: 
Columns  Jar 1 Blue Jar 1 Green Jar 1 Red Jar 2 Blue Jar 2 Green \ 
Date                  
05-10-2017   2   0   1   0   1 
05-11-2017   2   2   0   2   0 
05-12-2017   1   0   1   2   1 

      Jar 2 Red 
Date     
05-10-2017   1 
05-11-2017   3 
05-12-2017   0 

編輯:同樣的方法,更簡單,更快速版本

df['columns'] = 'Jar ' + df.Jar.astype(str) + ' ' + df.Color 
df.groupby(['Date', 'columns']).Jar.count().unstack(fill_value=0) 

這個版本應該擊敗get_dummies方法(或執行相同的)。

+0

嘿,添加計時https:// stackoverflow。com/a/46103374/4909087 –

+0

@cᴏʟᴅsᴘᴇᴇᴅ'dummy'是最好的:-) – Wen

+1

不長......看看大型測試! –