如何使用此lambda函数循环遍历DataFrame中的行,计算值并将该值放入新列中

时间:2019-05-08 22:31:15

标签: python-3.x pandas loops python-3.6

./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 :(得分:0)

csv_df['datetime']是序列,因此x中的apply是序列的每个单元格。您用applylambda呼叫days_until_exp(),但没有将x传递给它。因此,结果是错误的。

无论如何,如果没有样本数据,我想您想在sum中找到csv_df['datetime']-today()。为此,您不需要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

或: 查找所有增量中的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