#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