我有一个pd.dataframe,其中包含飞利浦Actiwatch的活动计数数据。如果超过60分钟没有活动计数,则用户可能没有佩戴该设备,应该删除此范围。
如何在我的Dataframe中检测> 60分钟(每行为1分钟)的句点并删除该完整句点。因此,如果59行或更少的活动计数为0,则不会发生任何事情,但如果60行或更多行的活动计数为0(假设80行),则此数据应为NaN。
可以在此处找到包含数据的csv文件: https://www.dropbox.com/s/6h43nrozohc9vd8/Actiwatch%20Data?dl=0
实在是没用,这就是我被卡住的地方:
# remove all data where Activity = 0 for 60 or more consecutive minutes:
zero_count = 0
for n in range(len(data)):
if data['Activity'].loc[n] == NaN:
continue
elif data['Activity'].loc[n] > 0:
continue
elif data['Activity'].loc[n] = 0:
while data['Activity'].loc[n] = 0:
zero_count = zero_count + 1
if zero_count >60:
# NaN last zero_count number of lines.
zero_count = 0
break
else:
zero_count = 0
break
else:
print "Non-wear detection error"
break
我试图做的是检查每一行,如果它是0,它应该向&#34; zero_count&#34;添加+1。当读取非零数字时,应检查zero_count是否> 60,如果是,则应该NaN整个范围并重置zero_count。如果它<60,则只需重置zero_count而不对任何数据进行NaN。
我希望任何人都能理解我要做的事情,或者:1)使代码在上面工作,或2)更好地了解我正在尝试做的事情。
由于
答案 0 :(得分:0)
你很接近,但你的代码中有一个无限循环。以及if语句中的一些逻辑有点过时了。这是一个纠正的解决方案。
streakCount = 0 # Counts the longest current streak
streakIndex = 0 # Keeps track of where the streak started
for n in range(len(data)):
if data['Activity'].loc[n] = 0:
if streakCount == 0:
streakIndex = n
streakCount += 1
elif data['Activity'].loc[n] > 0:
if streakCount > 60:
for i in range(streakIndex,streamIndex+streakCount): # loop to Nan out the range of 0's
data['Activity'].loc[i] = float('nan')
streakCount = 0 # reset streak