Skip to main content
 首页 » 编程设计

python之我想计算 Pandas DataFrame 中每一列的具体数字

2025年05月04日12xing901022

我想计算特定值 4 和 5 按比例出现在 pandas DataFrame 的每一列中的次数。

将此数据框作为输入:

| A | B | C | D | E | 
|---|---|---|---|---| 
| 3 | 3 | 1 | 2 | 1 | 
| 5 | 5 | 4 | 4 | 3 | 
| 3 | 4 | 1 | 1 | 5 | 
 

...首先获取每列的原始计数,类似这样...:

| A | B | C | D | E | 
|---|---|---|---|---| 
| 1 | 2 | 1 | 1 | 1 | 

...然后我想划分每一列的计数,以获得成比例的计数:

期望的输出:

| A    | B    | C    | D    | E    | 
|------|------|------|------|------| 
| 0.33 | 0.66 | 0.33 | 0.66 | 0.33 | 
 

我尝试了以下 df.counts() 但这只会返回总数。计数

请您参考如下方法:

使用DataFrame.isin对于获取掩码,对于计数值使用 sum,对于比率使用 mean,最后一行 DataFrame 添加 Series.to_frame转置:

mask = df.isin([4,5]) 
df1 = mask.sum().to_frame().T 
print (df1) 
   A  B  C  D  E 
0  1  2  1  1  1 
 
df2 = mask.mean().to_frame().T 
#or division 
#df2 = df1.div(len(df)) 
 
print (df2) 
          A         B         C         D         E 
0  0.333333  0.666667  0.333333  0.333333  0.333333 

编辑:Head Manager 的 groupby 解决方案是通过 Head Manager 创建索引,然后测试成员资格并计算 sum 或 意思是:

print (df) 
  Head Manager  A  B  C  D  E 
0         man1  3  3  1  2  1 
1         man1  5  5  4  4  3 
2         man1  3  4  1  1  5 
 
df11 = df.set_index('Head Manager').isin([4,5]).sum(level=0) 
#alternative 
#df11 = df.set_index('Head Manager').isin([4,5]).groupby(level=0).sum() 
print (df11) 
                A    B    C    D    E 
Head Manager                          
man1          1.0  2.0  1.0  1.0  1.0 
 
df22 = df.set_index('Head Manager').isin([4,5]).mean(level=0) 
#alternative 
#df22 = df.set_index('Head Manager').isin([4,5]).groupby(level=0).mean() 
print (df22) 
                     A         B         C         D         E 
Head Manager                                                   
man1          0.333333  0.666667  0.333333  0.333333  0.333333 

groupby.apply 的替代方法,但如果有很多组则速度较慢:

cols = df.columns.difference(['Head Manager']) 
df22 = df.groupby('Head Manager')[cols].apply(lambda x: x.isin([3,4]).mean()) 
print (df22) 
                     A         B         C         D         E 
Head Manager                                                   
man1          0.666667  0.666667  0.333333  0.333333  0.333333 

如果要指定一些列:

df22 = df.groupby('Head Manager')['A','B','C','D','E'].apply(lambda x: x.isin([3,4]).mean())