Выполните итерацию по фрейму данных, чтобы получить желаемый результат - PullRequest
0 голосов
/ 21 октября 2019

У меня есть фрейм данных, который имеет 3 поля

date_1, date_2, num_Days 

num_Days - это производный столбец, который вычисляется как date_2 - date_1

Я хочу вывести num_Days вдиапазон 1-30. В настоящее время он принимает больше значений, чем это.

Для следующего я хотел бы перебрать кадр данных и изменить date_2, где значение num_Days больше 30, используя случайное значение дельты.

Я пытался сделать это, используя следующую функцию:

date_format = '%d/%m/%y' 

def gen_by_delta(src_dates, num_days, date_format, delta_min, delta_max):
    gen_dates = []

    for dt in src_dates:
        src_date = datetime.datetime.strptime(dt, date_format)

        if src_date is None:
            gen_dates.append("")
            continue

        for d in num_days:

            if d > 30 :
                chosen_delta = pick_random_delta_in_range(min_days=delta_min, max_days=delta_max)
                result_date = (src_date + chosen_delta).strftime(date_format)
                gen_dates.append(result_date)

    return gen_dates

Использование этой функции выдает мне ошибку:

> data_string[found.end():])
> 
> ValueError: unconverted data remains: 19

Есть ли что-то, что мне не хватаетили любой другой лучший способ добиться того же?

1 Ответ

0 голосов
/ 21 октября 2019

При работе с Pandas обычно все лучше воспринимать как векторизованные операции. Итак, начнем с генерации серии случайных дельт в диапазоне от delta_min до delta_max включительно, предполагая, что ваш фрейм данных называется df:

rand_days = np.random.randint(delta_min, 1+delta_max, len(df))
rand_deltas = pd.to_timedelta(rand_days, unit="d")

Затем мы хотим заменить столбцы date2и num_Days с этим всякий раз, когда date2 - date1 находится вне нашего диапазона:

outside_range = df["date2"] - df["date1"] > pd.Timedelta(days=delta_max)
df["date2"][outside_range] = df["date1"][outside_range] + rand_deltas[outside_range]
df["num_Days"][outside_range] = rand_deltas[outside_range]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...