Передача переменной в лямбда-функцию - PullRequest
0 голосов
/ 29 января 2019

У меня есть следующий фрейм данных, который выглядит следующим образом:

print(df_example.to_dict())
{
    "slot_id": {
        0: 1,
        1: 2,
        2: 3,
        3: 4,
        4: 5
    },
    "class": {
        0: "A",
        1: "B",
        2: "C",
        3: "D",
        4: "E"
    },
    "day": {
        0: "Monday",
        1: "Tuesday",
        2: "Wednesday",
        3: "Thursday",
        4: "Saturday"
    },
    "base_date": {
        0: Timestamp("2019-01-21 00: 00: 00"),
        1: Timestamp("2019-01-22 00: 00: 00"),
        2: Timestamp("2019-01-23 00: 00: 00"),
        3: Timestamp("2019-01-24 00: 00: 00"),
        4: Timestamp("2019-01-26 00: 00: 00")
    },
    "next_date": {
        0: nan,
        1: nan,
        2: nan,
        3: nan,
        4: nan
    },
    "base_date_weekday": {
        0: 0,
        1: 1,
        2: 2,
        3: 3,
        4: 5
    }
}

df_example.head

Для столбца next_date я бы хотелнайти следующую дату, которая является днем ​​недели, в столбце day (понедельник, вторник и т. д.) от сегодняшней даты с помощью лямбда-функции ниже [найдено здесь] :

df_example['base_date'] = pd.to_datetime(df_example['base_date'].astype(str), format='%d%m%Y')
df_example['base_date_weekday'] = df_example['base_date'].dt.dayofweek
# Lambda function to find the next date that corresponds to a particular day of the week
onDay = lambda date, day: date + datetime.timedelta(days=(day-date.weekday()+7)%7)

Лямбда-функция работает с простым целым числом.

df_example['next_date'] = onDay(date=datetime.date.today(), day=2)

Но как я могу передать столбец day параметру day лямбды, чтобы он вычислял строку за строкой?Ни одна из следующих работ не работает:

df_example['next_date'] = onDay(date=datetime.date.today(), day=df_example['base_date_weekday'])
df_example['next_date'] = onDay(date=datetime.date.today(), day='base_date_weekday')

Я пытался использовать функцию и df.apply также безуспешно.

def next_weekday(weekday):
    todaydate = datetime.date.today()
    days_ahead = weekday - todaydate.weekday()
    if days_ahead <= 0: # Target day already happened this week
        days_ahead += 7
    return todaydate + datetime.timedelta(days_ahead)

df_example.apply(lambda base_date_weekday: next_weekday(base_date_weekday),axis=1)

Есть идеи, как мне справиться с этой простой задачей?

1 Ответ

0 голосов
/ 29 января 2019

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

def next_weekday(weekday):
    todaydate = datetime.date.today()
    days_ahead = weekday - todaydate.weekday()
    if days_ahead <= 0: # Target day already happened this week
        days_ahead += 7
    return todaydate + datetime.timedelta(days_ahead)

for i in range(df_example.shape[0]):
    df_example.loc[i,'next_date'] = next_weekday(weekday=int(df_example.loc[i,'base_date_weekday']))
    print(df_example)
...