2016-08-30 19 views
4

我想從以下數據框中創建一個數據透視表,其列sales,rep。數據透視表顯示sales,但不顯示rep。當我只用rep嘗試時,我得到了錯誤DataError: No numeric types to aggregate。如何解決這一問題,使得我看到這兩個數字字段sales和場(串)reppivot_table沒有要彙總的數字類型

data = {'year': ['2016', '2016', '2015', '2014', '2013'], 
     'country':['uk', 'usa', 'fr','fr','uk'], 
     'sales': [10, 21, 20, 10,12], 
     'rep': ['john', 'john', 'claire', 'kyle','kyle'] 
     } 

print pd.DataFrame(data).pivot_table(index='country', columns='year', values=['rep','sales']) 

     sales    
year  2013 2014 2015 2016 
country      
fr  NaN 10 20 NaN 
uk   12 NaN NaN 10 
usa  NaN NaN NaN 21 


print pd.DataFrame(data).pivot_table(index='country', columns='year', values=['rep']) 
DataError: No numeric types to aggregate 
+0

這取決於你正在努力去做。默認的agg函數是'mean',你不能考慮銷售代表的意思。請更改agg函數或傳遞另一列的值。如果你只是想使用樞軸,使用樞軸而不是pivot_table。 – ayhan

回答

13

你可以使用​​和unstack

df = pd.DataFrame(data) 
df.set_index(['year','country']).unstack('year') 

產量

  rep      sales     
year  2013 2014 2015 2016 2013 2014 2015 2016 
country             
fr  None kyle claire None NaN 10.0 20.0 NaN 
uk  kyle None None john 12.0 NaN NaN 10.0 
usa  None None None john NaN NaN NaN 21.0 

或者,使用pivot_tableaggfunc='first'

df.pivot_table(index='country', columns='year', values=['rep','sales'], aggfunc='first') 

產生

  rep      sales     
year  2013 2014 2015 2016 2013 2014 2015 2016 
country             
fr  None kyle claire None None 10 20 None 
uk  kyle None None john 12 None None 10 
usa  None None None john None None None 21 

aggfunc='first'隨着每個(country, year, rep)(country, year, sales) 組是通過取找到的第一個值aggregrated。在你的情況下,似乎沒有重複,所以第一個值與唯一值相同。

+1

set_index,它的巫毒,發誓它伏都教! – Merlin

1

看來,問題來自於不同類型的列代表和銷售,如果轉換的銷售str類型,並指定aggfunc爲sum,它工作正常:

df.sales = df.sales.astype(str) 

pd.pivot_table(df, index=['country'], columns=['year'], values=['rep', 'sales'], aggfunc='sum') 

#  rep       sales 
# year 2013 2014 2015 2016 2013 2014 2015 2016 
# country        
# fr None kyle claire None None  10  20 None 
# uk kyle None None john  12 None None 10 
#usa None None None john None None None 21