首页 > 解决方案 > Pandas 中的 COUNTIFS

问题描述

是否可以在 Pandas 中执行 MS Excel COUNTIFS?

我有一个包含 4 列的数据框,如下所示:

 project_number        crew1        crew2 crew3
0           V58615          EWP         None  None
1           V58615          EWP  Ground Line  None
2           V58615          EWP      Chipper  None
3           V58615          EWP      Chipper  None
4           V58615  Ground Line         None  None

然后我有另一个是所有项目编号的摘要。如果该值包含在另一个摘要列表中,有什么方法可以执行相当于 COUNTIFS 的计算 EWP 对应于值 V58615 的次数?我似乎遇到的问题是基于跨越 1 列的值。可以使用 if 对 for 循环中的单个列中的值执行此任务,但是超出范围的任何事情都变得困难以下是我尝试计算的方法:

project_numbers = np.array(vma_list.loc[:, 'Project Number'])
crews = konect_outstanding_tasks[['project_number', 'crew1', 'crew2', 
'crew3']]
 print(vma_list['Project Number'])
 l = np.where(crews == 'EWP',1,0)

 def equipment(crew):
   if crew == 'ewp':
      for x, y in enumerate(crews):
        vma_list.loc[x:, 'EWP'] = np.sum(np.where(crews[y] == 'EWP',1,0))
        print(vma_list)

如您所见,失败的原因有很多;它返回一个总和,但不像在 Excel 中使用 SUM 和 COUNTIF 的组合执行那样进行汇总

标签: pythonpandas

解决方案


我相信你DataFrame.melt首先需要DataFrame.dropna

df = konect_outstanding_tasks[['project_number', 'crew1', 'crew2', 'crew3']]

df1 = df.melt('project_number', var_name='a', value_name='v').dropna(subset=['v'])
print (df1)
  project_number      a            v
0         V58615  crew1          EWP
1         V58615  crew1          EWP
2         V58615  crew1          EWP
3         V58615  crew1          EWP
4         V58615  crew1  Ground Line
6         V58615  crew2  Ground Line
7         V58615  crew2      Chipper
8         V58615  crew2      Chipper

然后按每组计数GroupBy.size

df2 = df1.groupby(['project_number','v']).size().reset_index(name='count')
print (df2)
  project_number            v  count
0         V58615      Chipper      2
1         V58615          EWP      4
2         V58615  Ground Line      2

如果只需要ewp值首先比较并按sSeries.eq计数:Truesum

ewp = df1['v'].eq('EWP').sum()
print (ewp)
4

推荐阅读