python - 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 的组合执行那样进行汇总
解决方案
我相信你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
计数:True
sum
ewp = df1['v'].eq('EWP').sum()
print (ewp)
4
推荐阅读
- batch-file - 从 .bat 脚本模拟 CMD 提示的最佳方法
- windows - 动态更改文件扩展名外观
- windows - 为什么我的 IP 随机开始默认为 IPv6(以及我的私有 IP 更改)?
- java - 重新运行时将替换保存到文件的输入
- typescript - 打字稿 - 类型“未定义”不可分配给类型“字符串 | 号码 | 象征'
- javascript - Highcharts 绘图之间的交互性 - 寻找代码改进
- python - OpenPyxl当单元格的文本包含斜杠时获取真实的单元格值
- reactjs - 反应上下文提供者未在页面加载/刷新时设置值
- java - 打印出字符串而不是引用
- algorithm - GOOGLE 询问的该算法的伪代码是什么