>我在数据帧中有一个从excel中获取的表:
col A ColB colC colD
123451 a w p
123452 b x q
123453 c y r
123454 a x
123454 a w p
我想要这样的东西使用 pandas.pivot_table:
colC p q r "unassigned" "total"
w 2 0 0 0 2
x 0 1 0 1 2
y 0 0 1 0 1
您可以使用
crosstab
作为第一列,然后用isna
检查缺失值,并按agg
聚合,以按sum
计数,按size
总计,最后按DataFrame.join
连接在一起:
df1 = pd.crosstab(df.colC, df.colD)
print (df1)
colD p q r
colC
w 2 0 0
x 0 1 0
y 0 0 1
df2 = (df['colD'].isna()
.astype(int)
.groupby(df['colC'])
.agg([('unassigned','sum'),('total','size')]))
print (df2)
unassigned total
colC
w 0 2
x 1 2
y 0 1
df = df1.join(df2).reset_index()
print (df)
colC p q r unassigned total
0 w 2 0 0 0 2
1 x 0 1 0 1 2
2 y 0 0 1 0 1
您可以将所有None
替换为 'unassigned'
。然后使用交叉表获取相应的计数。使用带有正确轴的总和进行总数计数。
以下是执行此操作的代码
df1 = df[['colC', 'colD']].fillna('unassigned')
df1 = pd.crosstab(df1.colD, df1.colD)
df1['total'] = df1.sum(axis=1)
以下是代码的输出
D p q r unassigned total
C
w 2 0 0 0 2
x 0 1 0 1 2
y 0 0 1 0 1