Я все еще новичок в питонах. Я пытаюсь создать код Python, чтобы использовать самое раннее извлечение в качестве времени начала. Когда условие становится Y , я хотел бы создать дату окончания на основе условия:
Пример таблицы данных:
Я попробовал несколько способов получить данные, но безуспешно:
df['start date'] = df.groupby(['ID','SUB ID'], as_index = False)['Extraction Date].transform(min).reset_index()
df['start date'] = df.groupby(['ID','SUB ID'], as_index = False)['Extraction Date].min()
df['end date'] = df.query(Condition met (Y/N) == Y).groupby(['ID','SUB ID'], as_index = False['Extraction Date].transform(max).reset_index()
df['end date'] = df.query(Condition met (Y/N) == Y).groupby(['ID','SUB ID'], as_index = False['Extraction Date].min()
Что я хотел бы получить:
Вы можете использовать groupby
и transform("min")
, чтобы получить Start Date
, и loc
, чтобы получить End Date
:
df["Start Date"] = df.groupby(["ID", "SUB ID"])["Extraction Date"].transform("min")
df.loc[df["Condition met (Y/N)"] == "Y", "End Date"] = df["Extraction Date"]
ID SUB ID Extraction Date Condition met (Y/N) Start Date End Date
0 1 x 2023-01-02 N 2023-01-02 NaT
1 1 y 2023-01-02 N 2023-01-02 NaT
2 1 x 2023-02-15 N 2023-01-02 NaT
3 2 v 2023-02-15 N 2023-02-15 NaT
4 2 z 2023-02-15 N 2023-02-15 NaT
5 1 x 2023-03-15 Y 2023-01-02 2023-03-15
6 2 v 2023-03-15 Y 2023-02-15 2023-03-15
Вы почти у цели, в идеале то, что вы хотите использовать groupby
для "ID"
, "SUB ID"
, Extraction
, затем используйте transform
с min
, что вы и сделали.
затем вы можете использовать max
для извлечения последних дат.
Я следую предоставленному вами коду, все, что я сделал, это изменил его, чтобы вы могли сохранить уже имеющуюся у вас концепцию.
Вот фрагмент кода, используемый для создания вашего кода:
import pandas as pd
# Sample Data
data = {
"ID": [1, 1, 1, 2, 2, 1, 2],
"SUB ID": ["x", "y", "x", "v", "z", "x", "v"],
"Extraction Date": [
"2023-01-02",
"2023-01-02",
"2023-02-15",
"2023-02-15",
"2023-02-15",
"2023-03-15",
"2023-03-15",
],
"Condition met (Y/N)": ["N", "N", "N", "N", "N", "Y", "Y"],
}
# Convert to DataFrame
df = pd.DataFrame(data)
df["Extraction Date"] = pd.to_datetime(df["Extraction Date"])
# Calculate Start Date
df["Start Date"] = df.groupby(["ID", "SUB ID"])["Extraction Date"].transform("min")
# Calculate End Date
# filter rows where the condition is 'Y'
condition_y_df = df[df["Condition met (Y/N)"] == "Y"]
# map latest extraction date with condition 'Y' to each group
end_dates = condition_y_df.groupby(["ID", "SUB ID"])["Extraction Date"].transform("max")
# create series with correct end dates
end_date_series = condition_y_df[["ID", "SUB ID", "Extraction Date"]].copy()
end_date_series["End Date"] = end_dates
# Merge original DataFrame
df = df.merge(
end_date_series[["ID", "SUB ID", "Extraction Date", "End Date"]],
on=["ID", "SUB ID", "Extraction Date"],
how = "left",
)
# Fill NaT values with 'N/A'
df["End Date"] = df["End Date"].fillna("N/A")
print(df)
Результат:
ID SUB ID Extraction Date Condition met (Y/N) Start Date End Date
0 1 x 2023-01-02 N 2023-01-02 N/A
1 1 y 2023-01-02 N 2023-01-02 N/A
2 1 x 2023-02-15 N 2023-01-02 N/A
3 2 v 2023-02-15 N 2023-02-15 N/A
4 2 z 2023-02-15 N 2023-02-15 N/A
5 1 x 2023-03-15 Y 2023-01-02 2023-03-15
6 2 v 2023-03-15 Y 2023-02-15 2023-03-15