2014-01-30 87 views
3

我使用熊猫重塑一些字符串/数字值的响应,我遇到了一些有点不直观的行为。熊猫数据框堆叠与转轴

有人可以解释dataframes stacked及以下pivoted之间的区别,以及为什么pivoted2提高了DataError即使没有aggfunc传递?

import pandas as pd 

d = {'ID': pd.Series(['x']*3 + ['y']*3,index = range(6)), 
    'Count': pd.Series([1,2,1,1,1,1], index = range(6)), 
    'Value_type': pd.Series(['foo','foo','bar','foo','bar','baz'], index = range(6)), 
    'Value': pd.Series(range(1,7),index = range(6))} 
df = pd.DataFrame(d) 

d2 = {'ID': pd.Series(['x']*3 + ['y']*3,index = range(6)), 
    'Count': pd.Series([1,2,1,1,1,1], index = range(6)), 
    'Value_type': pd.Series(['foo','foo','bar','foo','bar','baz'], index = range(6)), 
    'Value': pd.Series(list('abcdef'),index = range(6))} 
df2 = pd.DataFrame(d2) 

restacked = df.set_index(['ID','Count','Value_type']).unstack() 
print restacked 

restacked2 = df2.set_index(['ID','Count','Value_type']).unstack() 
print restacked2 

pivoted = pd.pivot_table(df,rows = ['ID','Count'],cols = 'Value_type',values = 'Value') 
print pivoted 

## raises DataError('No numeric types to aggregate'), 
## even though no aggregation function is passed. 
pivoted2 = pd.pivot_table(df2,rows = ['ID','Count'],cols = 'Value_type',values = 'Value') 
print pivoted2 

回答

3

default agg functionnp.mean(即使你没有通过它明确这是正在使用的),不使对字符串的意义,其实它提出时传递的对象数组一个AttributeError - 所以大熊猫会在你尝试这样做时抱怨。

你可以通过np.sum

In [11]: pd.pivot_table(df2, rows=['ID', 'Count'], cols='Value_type', 
         values='Value', aggfunc=np.sum) 
Out[11]: 
Value_type bar baz foo 
ID Count     
x 1   c NaN a 
    2  NaN NaN b 
y 1   e f d 

或者使用iloc[0]采取的第一项:

In [12]: pd.pivot_table(df2, rows=['ID', 'Count'], cols='Value_type', 
         values='Value', aggfunc=lambda x: x.iloc[0]) 
Out[12]: 
Value_type bar baz foo 
ID Count     
x 1   c NaN a 
    2  NaN NaN b 
y 1   e f d 

注:这是一样的pivoted2['Value'],可以让这个输出一样pivoted2如果您将列表汇总为以下值:

In [13]: pd.pivot_table(df2, rows=['ID', 'Count'], cols=['Value_type'], 
         values=['Value'], aggfunc=lambda x: x.iloc[0]) 
Out[13]: 
      Value   
Value_type bar baz foo 
ID Count     
x 1   c NaN a 
    2   NaN NaN b 
y 1   e f d 
+0

谢谢,这工作完美。你能解释一下堆叠的数据框和旋转的数据框之间的区别吗? –

+1

@MichaelK只是pivot_table不会标记(作为multiindex的第一行)您正在抓取的值,*除非*您传递了值列的列表。也就是说:restacked ['Value'] == pivoted。 –