#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:
Возьмите несколько ключевых идей
- нужен список столбцов, которые входят в calc
daycols
- затем транспонируйте эти столбцы в массив для тестирования, выдает логический массив
- просуммируйте этот логический массив, и вы получите желаемый 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; LL5. Я обновил, чтобы оно соответствовало тому, что вы говорите, что вам нужны тысячи столбцов…