Выполните поиск по кадру данных с помощью регулярного выражения в цикле for, чтобы извлечь значение, связанное с регулярным выражением

#python #dataframe #for-loop

#питон #фрейм данных #для-петли

Вопрос:

У меня есть подмножество фрейма данных из гораздо большего фрейма данных. Мне нужно иметь возможность создать цикл for, который выполняет поиск по фрейму данных и извлекает данные, соответствующие правильному имени.

 import pandas as pd import numpy as np import re  data = {'Name': ['CH_1', 'CH_2', 'CH_3', 'FV_1', 'FV_2', 'FV_3'],  'Value': [1, 2, 3, 4, 5, 6]  }  df = pd.DataFrame(data)  FL = [17.7, 60.0] CH = [20, 81.4]  tol = 8 time1 = FL[0]   tol time2 = FL[1]   tol time3 = CH[0]   tol time4 = CH[1]   tol FH_mon = df['Values'] *5 workpercent = [.7, .92, .94] mhpy = [2087, 2503, 3128.75] list1 = list() list2 = list()  for x in df['Name']:  if x == [(re.search('FV_', s)) for s in df['Name'].values]:  y = np.select([FH_mon lt; time1 , (FH_mon gt;= time1) and (FH_mon lt; time2), FH_mon gt; time2], [workpercent[0],workpercent[1],workpercent[2]])  z = np.select([FH_mon lt; time1 , (FH_mon gt;= time1) and (FH_mon lt; time2), FH_mon gt; time2], [mhpy[0],mhpy[1],mhpy[2]])   if x == [(re.search('CH_', s)) for s in df['Name'].values]:  y = np.select([FH_mon lt; time3, (FH_mon gt;= time3) and (FH_mon lt; time4)], [workpercent[0],workpercent[1]])  z = np.select([FH_mon lt; time3, (FH_mon gt;= time3) and (FH_mon lt; time4)], [mhpy[0],mhpy[1]])  list1.append(y) list2.append(z)  

Ранее у меня была простая версия, в которой я просто добавил пару цифр, и я получал действительно полезные ответы на то, как я задал свой вопрос, но вот более сложная версия. Мне нужно выполнить поиск, и в любое время, когда в столбце имя есть FV, цикл if запускается и использует данные из столбца Имя с помощью FV. То же самое касается Ч. У меня есть списки, чтобы отслеживать каждое значение, когда цикл проходит через столбец Имя. Если есть более простой способ, я был бы очень признателен, если бы увидел его, но сейчас это кажется самым чистым способом, но я получаю ошибки, или цикл не будет функционировать должным образом.

Ответ №1:

Если столбец «Имя» содержит только значения, начинающиеся с «FV_» или «CH_», используйте where :

 df["Value"] = df["Value"].add(2).where(df["Name"].str.startswith("FV_"), df["Value"].add(4))  

Если у вас могут быть другие значения в поле «Имя», используйте numpy.select :

 import numpy as np  df["Value"] = np.select([df["Name"].str.startswith("FV_"), df["Name"].str.startswith("CH_")], [df["Value"].add(2), df["Value"].add(4)])  
Выход:
 gt;gt;gt; df  Name Value 0 CH_1 5 1 CH_2 6 2 CH_3 7 3 FV_1 6 4 FV_2 7 5 FV_3 8  

Ответ №2:

Это должно быть то, чего ты хочешь:

 for index, row in df.iterrows():   if re.search("FV_", row["Name"]):   df.loc[index, "Value"]  = 2   elif re.search("CH_", row["Name"]):   df.loc[index, "Value"]  = 4