Создание даты начала и окончания – Python

Я все еще новичок в питонах. Я пытаюсь создать код Python, чтобы использовать самое раннее извлечение в качестве времени начала. Когда условие становится Y , я хотел бы создать дату окончания на основе условия:

Пример таблицы данных:

ИДЕНТИФИКАТОР ИДЕНТИФИКАТОР ПОДПИСКИ Дата извлечения Условия соблюдены (Да/Нет) 1 х 2023-01-02 Н 1 й 2023-01-02 Н 1 х 15 февраля 2023 г. Н 2 в 15 февраля 2023 г. Н 2 я 15 февраля 2023 г. Н 1 х 2023-03-15 Да 2 в 2023-03-15 Да

Я попробовал несколько способов получить данные, но безуспешно:

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()

Что я хотел бы получить:

ИДЕНТИФИКАТОР ИДЕНТИФИКАТОР ПОДПИСКИ Дата извлечения Условия соблюдены (Да/Нет) Дата начала Дата окончания 1 х 2023-01-02 Н 2023-01-02 Н/Д 1 й 2023-01-02 Н 2023-01-02 Н/Д 1 х 15 февраля 2023 г. Н 2023-01-02 Н/Д 2 в 15 февраля 2023 г. Н 15 февраля 2023 г. Н/Д 2 я 15 февраля 2023 г. Н 15 февраля 2023 г. Н/Д 1 х 2023-03-15 Да 2023-01-02 2023-03-15 2 в 2023-03-15 Да 15 февраля 2023 г. 2023-03-15
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
52
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете использовать 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

Другие вопросы по теме