Pandas Dataframe Stacking and Pivoting

Я использую pandas для изменения некоторых строковых / числовых значений, и я столкнулся с некоторым поведением, которое немного противоречит интуиции.

Может ли кто-нибудь объяснить разницу между фреймами данных, 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 

Функция agg по умолчанию – np.mean (даже если вы не np.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 efd 

Или возьмите первый элемент, используя 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 efd 

Обратите внимание: это то же самое, что и 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 efd