Python 在数据帧上迭代,若满足条件,则递增计数器 简化示例

Python 在数据帧上迭代,若满足条件,则递增计数器 简化示例,python,pandas,loops,dataframe,counter,Python,Pandas,Loops,Dataframe,Counter,我有一个CSV文件,我想遍历行,计算某个值在某个范围内出现的次数。我的CSV大约有500行,但下面是一个简化的示例: Time key 0 -5 LeftShift 1 10 LeftShift 2 20 C 3 30 LeftShift 4 40 C 我试图计算字符串“C”在特定时间范围内出现的次数。我还想计算“C”在时间范围之外出现的次数 import pandas as pd # Name of file to read fi

我有一个CSV文件,我想遍历行,计算某个值在某个范围内出现的次数。我的CSV大约有500行,但下面是一个简化的示例:

   Time        key
0    -5  LeftShift
1    10  LeftShift
2    20  C
3    30  LeftShift
4    40  C
我试图计算字符串“C”在特定时间范围内出现的次数。我还想计算“C”在时间范围之外出现的次数

import pandas as pd

# Name of file to read
filename = "test.csv"

#data frame to create from file
df = pd.read_csv(filename)

# Set counters
correct_hit = 0
incorrect_hit = 0

# Time range (milliseconds) to compare
range1 = 0
range2 = 20
range3 = 20.01
range4 = 40

if (range1 < Time <= range2) and (Key == "C"):
    incorrect_hit += 1
elif (range3 < Time <= range4) and (Key == "C"):
    correct_hit += 1
感谢@PaSTE的回复和指导

又一次尝试
将熊猫作为pd导入
#要读取的文件名
filename=“TEST.csv”
#要从文件创建的数据帧
df=pd.read\u csv(文件名)
#设置计数器
正确点击=0
不正确的\u hit=0
#正确点击的时间范围(毫秒)
#范围1-2和3-4是正确的命中率
范围1=92001
范围2=96000
范围3=376004
范围4=380004
#错误点击的时间范围(毫秒)
范围5=12000
范围6=16000
范围7=28000
范围8=32000
范围9=44001
范围10=48001
范围11=60000
范围12=64001
#射程13-14不正确命中
范围13=76000
范围14=80001
#
范围15=108001
范围16=112001
范围17=124001
范围18=128001
范围19=140001
范围20=144001
范围21=156002
范围22=160001
范围23=172002
范围24=176002
范围25=188002
范围26=192002
范围27=204002
范围28=208002
范围29=280003
范围30=284003
范围31=296003
范围32=300003
范围33=312003
范围34=316003
范围35=328004
范围36=332003
范围37=344004
范围38=348004
范围39=360004
范围40=364004
#射程41到42不正确
范围41=392004
范围42=396005
#
范围43=408004
范围44=412005
范围45=424004
范围46=428004
范围47=440005
范围48=444004
范围49=456005
范围50=460005
范围51=472005
范围52=476005
#这将比较正确响应的数量

条件1=(df[“Time”]>=范围1)和(df[“Time”]=范围3)和(df[“Time”]=范围5)和(df[“Time”]=范围7)和(df[“Time”]=范围9)和(df[“Time”]=范围11)和(df[“Time”]=范围13)和(df[“Time”]=范围15)和(df[“Time”]=范围17)和(df[“Time”]=范围19)和(df[“Time”]=范围21)和(df[“Time”]=范围23)和(df[“Time”=范围时间[…]=range27)&(df[“Time”]=range29)&(df[“Time”]=range31)&(df[“Time”]=range33)&(df[“Time”]=range35)&(df[“Time”]=range37)&(df[“Time”]=range39)&(df[“Time”]=range41)&(df[“Time”]=range45)&(df[“Time”=range47)&(df[“Time”]=range49)&(df[“Time”=range51)]Pandas是围绕列操作设计的,因此从列的角度考虑,您可以简单地对数据帧本身的列进行比较,然后将
True
值的数量相加。采用第一个条件:

condition1 = (df["Time"] > range1) & (df["Time"] <= range2) & (df["Key"] == "C")
incorrect_hit = condition1.sum()
在这三个系列之间执行元素逻辑“与”操作,创建如下所示的最终系列:

0  False
1  False
2   True
3  False
4  False
将序列中的所有值相加,
True
值将总和加1,
False
值将总和加0

第二个条件类似:

condition2 = (df["Time"] > range3) & (df["Time"] <= range4) & (df["Key"] == "C")
correct_hit = condition2.sum()

condition2=(df[“Time”]>range3)和(df[“Time”]您能添加预期的输出吗?您的逻辑与问题描述不完全匹配。例如,Time=-5似乎不在0-20范围内,但两个if子句都无法捕获它。是的,我只是忽略了第一行,因为它出于某种原因会输出负值。就预期的输出而言,计数器目前是我的预期输出。使用我展示的逻辑和值,它将是:正确的\u hit=1错误的\u hit=1谢谢!这对理解如何使用数据帧非常有帮助。:)当我添加更多要比较的范围时,正如我的示例所简化的那样,它似乎不起作用。我不能使用此技术比较两个以上的时间范围吗?
#这比较了正确响应的数量:条件2=(df[“time”]>=range1)&(df[“time”]=range3)&(df[“time”]如果
range1
range2
等引用的范围与示例代码中的范围相同,那么
condition2
的表达式逻辑上排除了所有可能的时间。没有任何数字
x
可以同时满足这两个
x=20.1
的要求。您想用这一行做什么?
   Time > 0  Time <= 20  key == C
0     False        True     False
1      True        True     False
2      True        True      True
3      True       False     False
4      True       False      True
0  False
1  False
2   True
3  False
4  False
condition2 = (df["Time"] > range3) & (df["Time"] <= range4) & (df["Key"] == "C")
correct_hit = condition2.sum()