Python 使用np.argwhere对数据帧中缺少的值进行计数

Python 使用np.argwhere对数据帧中缺少的值进行计数,python,pandas,dataframe,np,Python,Pandas,Dataframe,Np,我有这样的e数据帧: RTD I0 BA 321 BA 152 BA 223 BA 754 BA 285 BA 326 BA 7 现在,我要计算连续的最小行数和最大行数,其中32行数不存在 代码为(参考:@MaxU): len(x)-np.argwhere(x.I==32.max()-1 out=1(正确) len(x)-np.argwhere(x.I==32.min()-1 Out=6(这是错误的,因为结果应该是4 我找到的解决方案是: import pandas as pd import n

我有这样的e数据帧:

RTD I
0 BA 32
1 BA 15
2 BA 22
3 BA 75
4 BA 28
5 BA 32
6 BA 7

现在,我要计算连续的最小行数和最大行数,其中32行数不存在

代码为(参考:@MaxU):

len(x)-np.argwhere(x.I==32.max()-1
out=1(正确)

len(x)-np.argwhere(x.I==32.min()-1
Out=6(这是错误的,因为结果应该是4 我找到的解决方案是:

import pandas as pd
import numpy as np


df = pd.DataFrame({'RTD': ['BA']*7, 'I': [32, 15, 22, 75, 28, 32, 7]})
print (df )
用于计算最大e最小延迟:

如果索引的顺序为0到n-1,则只能选择值32,然后取索引的第一个差值

np.diff(np.append(-2, df.query('I==32').index.values)) -1

我不理解第一个值,但这应该会让您非常接近。

这是一个有点健壮的解决方案,但它是有效的。我包含了完整的代码,所以如果我误解了某些内容,您可以纠正我:

import pandas as pd
import numpy as np

df = pd.DataFrame({'RTD': ['BA']*7, 'I': [32, 15, 22, 75, 28, 32, 7]})
occurrences = df[df['I'] == 32].min(axis=1).index.values
max_diff = 0
for i in range(len(occurrences)-1):
    curr_diff = occurrences[i + 1] - occurrences[i] - 1
    if  curr_diff > max_diff:
        max_diff = curr_diff

min_diff = len(df['I'])
occurrences = np.append(occurrences, min_diff - 1)

for i in range(len(occurrences)-1):
    curr_diff = occurrences[i + 1] - occurrences[i]
    if  curr_diff < min_diff:
        min_diff = curr_diff
将熊猫作为pd导入
将numpy作为np导入
df=pd.DataFrame({'RTD':['BA']*7,'I':[32,15,22,75,28,32,7]})
事件数=df[df['I']==32].min(轴=1).index.values
最大差值=0
对于范围内的i(len(出现次数)-1):
curr_diff=出现次数[i+1]-出现次数[i]-1
如果当前差异>最大差异:
最大差值=当前差值
最小差值=len(df['I'])
引用=np.append(引用,最小差异-1)
对于范围内的i(len(出现次数)-1):
curr_diff=出现次数[i+1]-出现次数[i]
如果当前差异<最小差异:
最小差异=当前差异

您所说的“计算缺失的最短和最长时间”是什么意思?没有缺失值。向下滚动列的数字32出现在位置0和5。如果没有数字32,我将计算连续行的最大值,如果没有数字32,则计算连续行的最小值。AttributeError:'Int64Index'对象没有属性'diff'我的错误。索引没有差异。使用numpy diff functionHi。解决这个问题非常困难。可能需要一个基于len of index的循环,条件为true。不,不需要循环。上面的代码符合我理解的问题。@Andreas现在检查一下。我没有o将-2追加到数组的前面,以获得与您匹配的第一个值。@Andreas我认为这段代码涵盖了您的问题,即事件之间的最小和最大延迟。哪一部分看起来不合适?
import pandas as pd
import numpy as np

df = pd.DataFrame({'RTD': ['BA']*7, 'I': [32, 15, 22, 75, 28, 32, 7]})
occurrences = df[df['I'] == 32].min(axis=1).index.values
max_diff = 0
for i in range(len(occurrences)-1):
    curr_diff = occurrences[i + 1] - occurrences[i] - 1
    if  curr_diff > max_diff:
        max_diff = curr_diff

min_diff = len(df['I'])
occurrences = np.append(occurrences, min_diff - 1)

for i in range(len(occurrences)-1):
    curr_diff = occurrences[i + 1] - occurrences[i]
    if  curr_diff < min_diff:
        min_diff = curr_diff