python - how to use two different functions within crosstab/pivot_table in pandas? -
using pandas, possible compute single cross-tabulation (or pivot table) containing values calculated 2 different functions?
import pandas pd import numpy np c1 = np.repeat(['a','b'], [50, 50], axis=0) c2 = list('xy'*50) c3 = np.repeat(['g1','g2'], [50, 50], axis=0) np.random.shuffle(c3) c4=np.repeat([1,2], [50,50],axis=0) np.random.shuffle(c4) val = np.random.rand(100) df = pd.dataframe({'c1':c1, 'c2':c2, 'c3':c3, 'c4':c4, 'val':val}) frequencytable = pd.crosstab([df.c1,df.c2],[df.c3,df.c4]) meanval = pd.crosstab([df.c1,df.c2],[df.c3,df.c4],values=df.val,aggfunc=np.mean) so, both rows , columns same in both tables, i'd table both frequencies , mean values:
c3 g1 g2 c4 1 2 1 2 c1 c2 freq val freq val freq val freq val x 6 0.624931 5 0.582268 8 0.528231 6 0.362804 y 7 0.493890 8 0.465741 3 0.613126 7 0.312894 b x 9 0.488255 5 0.804015 6 0.722640 5 0.369480 y 6 0.462653 4 0.506791 5 0.583695 10 0.517954
you can give list of functions:
pd.crosstab([df.c1,df.c2], [df.c3,df.c4], values=df.val, aggfunc=[len, np.mean]) if want table shown in question, have rearrange levels bit:
in [42]: table = pd.crosstab([df.c1,df.c2], [df.c3,df.c4], values=df.val, aggfunc=[len, np.mean]) in [43]: table out[43]: len mean c3 g1 g2 g1 g2 c4 1 2 1 2 1 2 1 2 c1 c2 x 4 6 8 7 0.303036 0.414474 0.624900 0.425234 y 5 5 8 7 0.543363 0.480419 0.583499 0.637657 b x 10 6 4 5 0.400279 0.436929 0.442924 0.287572 y 6 8 5 6 0.400427 0.623319 0.764506 0.408708 in [44]: table.reorder_levels([1, 2, 0], axis=1).sort_index(axis=1) out[44]: c3 g1 g2 c4 1 2 1 2 len mean len mean len mean len mean c1 c2 x 4 0.303036 6 0.414474 8 0.624900 7 0.425234 y 5 0.543363 5 0.480419 8 0.583499 7 0.637657 b x 10 0.400279 6 0.436929 4 0.442924 5 0.287572 y 6 0.400427 8 0.623319 5 0.764506 6 0.408708
Comments
Post a Comment