我写了一个小脚本来衡量不同 @Andy L. 方法的性能。
第二种方法似乎稍微快一些:
def pivot_table_3d_1(df, col1, col2, col3, value, aggfunc='first') :
iix = pd.MultiIndex.from_product([np.unique(df[col2]), np.unique(df[col3])])
df_pivot = (df.pivot_table(value, col1, [col2,col3], aggfunc=aggfunc)
.reindex(iix, axis=1))
arr = np.array(df_pivot.groupby(level=0, axis=1).agg(lambda x: [*x.values])
.to_numpy().tolist())
return arr
def pivot_table_3d_2(df, col1, col2, col3, value, aggfunc='first') :
iix_n = pd.MultiIndex.from_product([np.unique(df[col1]), np.unique(df[col2])])
arr = (df.pivot_table(value, [col1, col2], col3, aggfunc=aggfunc)
.reindex(iix_n).to_numpy()
.reshape(df[col1].nunique(),df[col2].nunique(),-1))
return arr
N1 = 100
N2 = 200
N3 = 300
df = pd.DataFrame({'col1': np.random.randint(0, N1, N1*N2*N3),
'col2': np.random.randint(0, N2, N1*N2*N3),
'col3': np.random.randint(0, N3, N1*N2*N3),
'value': np.random.normal(0,1,N1*N2*N3)})
%timeit pivot_table_3d(df, col1='col1', col2='col2', col3='col3', value='value')
%timeit pivot_table_3d_2(df, col1='col1', col2='col2', col3='col3', value='value')
MultiIndex
解决了这个问题,你可以使用它来实现多维度。尝试一下这段代码:df.pivot_table(index='Date', columns=['Site', 'Measurement Type'], values='Value', aggfunc=lambda x: x)
。 - Erfan