2016-12-06 2 views
0

У меня есть следующие areaId и areaNo информации. Я пытаюсь создать матрицу с их агрегированных значениямиСоздать агрегированную матрицу с использованием 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 

я был в состоянии получить количество areaIds для каждой зоны с использованием groupby, однако мне нужна матрица.

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 

Или с помощью groupby и unstack

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 
Смежные вопросы