Как я могу зациклить строки в моем DataFrame, вычислить значение и поместить это значение в новый столбец с помощью этой лямбда-функции - PullRequest
1 голос
/ 09 мая 2019

./test.csv выглядит так:

     price     datetime
1    100       2019-10-10
2    150       2019-11-10
...

import pandas as pd    
import datetime as date
import datetime as time
from datetime import datetime
from datetime import timedelta

csv_df = pd.read_csv('./test.csv')

today = datetime.today()

csv_df['datetime'] = csv_df['expiration_date'].apply(lambda x: pd.to_datetime(x)) #convert `expiration_date` to datetime Series


def days_until_exp(expiration_date, today):


    diff = (expiration_date - today)
    return [diff]

csv_df['days_until_expiration'] = csv_df['datetime'].apply(lambda x: days_until_exp(csv_df['datetime'], today))

Я пытаюсь перебрать определенный столбец в моем DateFrame с меткой csv_df['datetime'], который в каждой ячейке имеет только одно значение, дату, и выполнить калькуляцию, определенную diff.

Тогда я хочу, чтобы единственное значение diff было добавлено в новую серию csv_df['days_until_expiration'].

Проблема в том, что он вычисляет значения для каждой строки (673 строки) и помещает все эти значения в список в каждой строке csv_df['days_until_expiration. Я понимаю, что это может быть из-за скобок вокруг [diff], но без них я получаю ошибку.

В Excel я бы просто сделал что-то вроде = SUM (datetime - price), щелкнул и потянул вниз по строкам, чтобы он заполнил новый столбец. Тем не менее, я хочу сделать это в Pandas, поскольку это является частью более крупного приложения.

1 Ответ

0 голосов
/ 09 мая 2019

csv_df['datetime'] - серия, поэтому x из apply - каждая ячейка серии. Вы звоните apply с lambda и days_until_exp(), но вы не передаете ему x. Поэтому результат неправильный.

В любом случае, без ваших выборочных данных, я думаю, вы хотите найти sum из csv_df['datetime'] - сегодня (). Для этого вам не нужно apply. Просто сделайте прямую векторизацию для серий и sum.

Я делаю 2 столбца данных для образца:

csv_df:
    datetime  days_until_expiration
0 2019-09-01                    NaN
1 2019-09-02                    NaN
2 2019-09-03                    NaN

Выполните следующую обратную серию дельта между csv_df['datetime'] и today(). Я думаю, вы хотите это ::

td = datetime.datetime.today()    
csv_df['days_until_expiration'] = (csv_df['datetime'] - td).dt.days

csv_df:
    datetime  days_until_expiration
0 2019-09-01                    115
1 2019-09-02                    116
2 2019-09-03                    117

OR: Чтобы найти sum всех дельт и присвоить одно и то же значение sum для csv_df['days_until_expiration']

csv_df['days_until_expiration'] = (csv_df['datetime'] - td).dt.days.sum()

csv_df:
    datetime  days_until_expiration
0 2019-09-01                    348
1 2019-09-02                    348
2 2019-09-03                    348
...