2016-12-06 57 views
0

我有以下areaIdareaNo信息。我想创建一个矩阵,其累计值使用Pandas创建聚合矩阵

areaId       areaNo 
a1         01 
a1         02 
a1         02 
b1         03 
b1         03 
b2         01 
b2         03 

期望中的矩阵

  01  02  03 
a1  1  2  0 
b1  0  0  2 
b2  1  0  0 

我能得到使用groupby每个区域areaIds的数量,但是我需要一个矩阵。

grouped = df.groupby('areaId') 

df2 = pd.DataFrame({ 
    'areaId': grouped['areaNo'].size().index, 
    'nrArea': grouped['areaId'].nunique(), 
}) 

我该如何获得?

回答

1

你可以使用pd.crosstab

In [82]: df 
Out[82]: 
    areaId areaNo 
0  a1  1 
1  a1  2 
2  a1  2 
3  b1  3 
4  b1  3 
5  b2  1 
6  b2  3 

In [83]: pd.crosstab(df['areaId'], df['areaNo']) 
Out[83]: 
areaNo 1 2 3 
areaId 
a1  1 2 0 
b1  0 0 2 
b2  1 0 1 

或者使用pd.pivot_table

In [87]: pd.pivot_table(df, index='areaId', columns='areaNo', aggfunc=len, fill_value=0) 
Out[87]: 
areaNo 1 2 3 
areaId 
a1  1 2 0 
b1  0 0 2 
b2  1 0 1 

或者用groupbyunstack

In [88]: df.groupby(['areaId', 'areaNo']).size().unstack('areaNo').fillna(0) 
Out[88]: 
areaNo 1 2 3 
areaId 
a1  1.0 2.0 0.0 
b1  0.0 0.0 2.0 
b2  1.0 0.0 1.0