хотите вычислить количество проходных экземпляров набора данных с использованием python pandas

#python-3.x #pandas

#python-3.x #pandas

Вопрос:

 x=[]
y1=[]
r1=len(df)
L1=len(df.columns)

for i in range(r1):
    ll=(df.loc[i,'LL'])
    ul=(df.loc[i,'UL'])
    count1 =0
    for j in range(5,L1):
        if isinstance(df.iloc[i,j],str):
            df.loc[i,j]=0
        
        if ll<=df.iloc[i,j]<=ul:
            count1=count1 1
    if count1==(L1-5):
        x.append('Pass')
    else:
        x.append('Fail')
    y1.append(count1)  
    
se = pd.Series(x)
se1=pd.Series(y1)
df['Min']=min1.values
df['Mean']=mean1.values
df['Median']=median1.values
df['Max']=max1.values
df['Pass Count']=se1.values

df['Result']=se.values

min1 = df.iloc[:,5:].min(axis=1)

mean1=df.iloc[:,5:].astype(float).mean(axis=1,skipna = True)
median1=df.iloc[:,5:].astype(float).median(axis=1,skipna = True)

max1=df.iloc[:,5:].max(axis=1)
count1=df.iloc[:,5:].count(axis=1)


yield1=[]
for i in range(len(se1)):
    yd1=(se1[i]/(L1-3))*100
    yield1.append(yd1)
    
se2=pd.Series(yield1)  
df['Yield']=se2.values
df1=df.loc[:,['PARAMETER','Min','Mean','Median','Max','Result','Pass Count','Yield']]
df1  

Ниже приведен мой набор данных, это данные датчиков на ежедневной основе. Ежедневные данные должны находиться в пределах нижнего предела (LL) и верхнего предела (UL). Я хочу подсчитать, сколько дней данные датчиков находятся в пределах LL и UL.
Я не могу вычислить количество дней для данных датчика в пределах LL и UL, используя Pandas. Как я могу вычислить количество дней для данных датчика в пределах LL и UL?
введите описание изображения здесь

Комментарии:

1. предоставьте свои данные в виде текста, а не изображения

2. местоположение датчика, LL, UL, день1, день2, день3, день4, день5, день6, день7, количество дней, в течение которых данные датчика находятся в пределах LL и UL A,1,10,12,6,9,4,9,7,15,5 B,1,12,4,15,7,1,11,1,7,6 C,1,15,13,13,13,10,7,13,13,7 D,1,10,12,1,14,12,15,4,4,3 E,1,20,11,15,8,14,1,14,14,7

Ответ №1:

Возьмите несколько ключевых идей

  1. нужен список столбцов, которые входят в calc daycols
  2. затем транспонируйте эти столбцы в массив для тестирования, выдает логический массив
  3. просуммируйте этот логический массив, и вы получите желаемый calc
 df = pd.read_csv(io.StringIO("""sensor location,LL,UL,day1,day2,day3,day4,day5,day6,day7,number of days sensor data within LL and UL 
A,1,10,12,6,9,4,9,7,15,5 
B,1,12,4,15,7,1,11,1,7,6 
C,1,15,13,13,13,10,7,13,13,7 
D,1,10,12,1,14,12,15,4,4,3 
E,1,20,11,15,8,14,1,14,14,7"""))

daycols = [d for i,d in enumerate(df.columns) if "day" in d and "number" not in d]
df = df.assign(
    # use fact true is 1 so sum a truth array gives the answer
    daysBetween=lambda dfa: ((dfa.loc[:,daycols].T>=dfa["LL"]) amp; 
                             (dfa.loc[:,daycols].T<=dfa["UL"])).sum()
)

print(df.to_string(index=False))
  

вывод

 sensor location  LL  UL  day1  day2  day3  day4  day5  day6  day7  number of days sensor data within LL and UL   daysBetween
              A   1  10    12     6     9     4     9     7    15                                             5            5
              B   1  12     4    15     7     1    11     1     7                                             6            6
              C   1  15    13    13    13    10     7    13    13                                             7            7
              D   1  10    12     1    14    12    15     4     4                                             3            3
              E   1  20    11    15     8    14     1    14    14                                             7            7
  

ускорить

Если у вас много столбцов, вы можете использовать возможность среза, чтобы идентифицировать их и превратить в индексы, чтобы iloc их можно было использовать. Кроме того, транспонирование не требуется.

 dayi = [df.columns.get_loc(c) for c in df.columns[3:-1]]
df = df.assign(
    # use fact true is 1 so sum a truth array gives the answer
    daysBetween=lambda dfa: ((dfa.iloc[:,dayi]>=dfa["LL"]) amp; 
                             (dfa.iloc[:,dayi]<=dfa["UL"])).sum()
)

  

Комментарии:

1. Спасибо @Rob Raymod, это очень полезно для меня

2. спасибо за помощь, в реальном сценарии у меня будет много столбцов (скажем, 1000), и имена столбцов будут разными (иногда в наборе данных будут даты). итак, я хочу получить доступ ко всем столбцам от column3 до (последний столбец-1). я хочу использовать для этого функцию iloc, как показано ниже, но этот код не работает и требует очень много времени для выполнения с большими данными

3. пожалуйста, обратитесь к оригинальному сообщению, добавил код, приведенная ниже часть приведенного кода не работает для i в диапазоне (r1): ll=(df.loc[i,’LL’]) ul = (df.loc[i,’UL’]) count1 = 0 для j в диапазоне (5, L1): если isinstance(df.iloc[i, j], str): df.loc[i, j] =0, если ll<= df.iloc[i,j]<=ul: count1=count1 1, если count1==(L1-5): x.добавить (‘Пройти’) иначе: x.добавить (‘Сбой’) y1.добавить(count1)

4. Я предоставил решение на основе векторов, и вы изменили его обратно на циклическое решение. поэтому он будет работать очень плохо. Я мог бы daycols = df.columns[3:-1] использовать это вместо этого. Суть в том, что вам нужен список столбцов, которые необходимо сравнить с UL amp; LL

5. Я обновил, чтобы оно соответствовало тому, что вы говорите, что вам нужны тысячи столбцов…