我有以下areaId
和areaNo
信息。我正在尝试创建一个带有聚合值的矩阵
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(),
})
我怎样才能获得这个?
答案 0 :(得分: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