применить функцию к столбцу фрейма данных - PullRequest
2 голосов
/ 07 мая 2020

У меня есть фрейм данных x,

Пожалуйста, просмотрите фрейм данных x здесь

Мы хотим создать новый столбец, используя функцию ниже, которая добавит значение полных столбцов в начать и создать новый столбец fini sh.

import datetime
def date_by_adding_business_days(from_date, add_days):
    business_days_to_add = add_days
    current_date = from_date
    while business_days_to_add > 0:
        current_date += datetime.timedelta(days=1)
        weekday = current_date.weekday()
        if weekday >= 5: # sunday = 6
            continue
        business_days_to_add -= 1
    return current_date

Я пробовал получить эту ошибку ниже, пожалуйста, помогите.

x['Finish'] = x.apply(date_by_adding_business_days(datetime.date.today(), x['Complete']))

ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Ответы [ 3 ]

2 голосов
/ 07 мая 2020

Ваш подход правильный. Вам просто нужно передать ссылку на функцию.

Когда вы вызываете apply. Он передаст строку фрейма данных в функцию и вызовет ее.

Вы можете вычислить такие переменные, как сегодняшняя дата, внутри самой функции

def date_by_adding_business_days(row):
    add_days = row['Complete']
    from_date = datetime.date.today()

    business_days_to_add = add_days
    current_date = from_date
    while business_days_to_add > 0:
        current_date += datetime.timedelta(days=1)
        weekday = current_date.weekday()
        if weekday >= 5:  # sunday = 6
            continue
        business_days_to_add -= 1
    return current_date

x['Finish'] = x.apply(date_by_adding_business_days, axis=1)
2 голосов
/ 07 мая 2020

Попытайтесь реорганизовать свой код. Если вы примените функцию только к одному столбцу, вы сделаете это неправильно. Кроме того, по какой-то причине вы пытаетесь вызвать функцию, передавая ей время. Зачем, если вы можете просто получить это прямо в функции:

import datetime
def date_by_adding_business_days(add_days):
    business_days_to_add = add_days
    current_date = datetime.date.today()
    while business_days_to_add > 0:
        current_date += datetime.timedelta(days=1)
        weekday = current_date.weekday()
        if weekday >= 5: # sunday = 6
            continue
        business_days_to_add -= 1
    return current_date

x['Finish'] = x['Complete'].apply(date_by_adding_business_days)
0 голосов
/ 07 мая 2020

Хотя оба вышеперечисленных подхода служат цели, я думаю, что второй вариант быстрее, когда apply () выполняется для строк одного столбца. Если сопоставить эти решения в записной книжке с образцом фрейма данных, приведенным в вопросе, разница станет очевидной.

Прилагается снимок экрана. Timing apply() function

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...