将第一个日期实例添加到pandas dataframe

时间:2015-04-22 13:28:20

标签: python pandas

我是Pandas的新手并且有一个包含三列的pandas Dataframe(每列有数千行):

  1. 客户ID号码(按升序排序),某些客户的多个ID,如果他们已收到多个优惠/接受多个优惠(dtype:int)
  2. 日期&向每位客户提出要约的时间(dtype:datetime64 [ns])
  3. 数据&如果客户接受第2栏中的报价,则为时间,否则为NaT。
  4. 我想要做的是首先找到第2列中对每个独立客户提出的最早报价的日期,然后找到每个客户接受报价的最早日期(如果有的话)(=第3列有日期),并且从首次接受报价的日期开始减去首次报价给客户的日期。

    因此,这将为我提供每个客户首次接受报价的时间与同一客户首次报价的时间之间的时间范围(最好以天为单位)。这几天的时间应该附加到一个新列(如果他接受了任何报价,它将为每个客户列出相同的值,否则为NaN。)

    我尝试过各种各样的方式,使用熊猫' .map与lambda一起创建帮助列和各种函数,但似乎无法弄明白。

    这样做有一种优雅的方法吗?

    任何帮助表示感谢。

2 个答案:

答案 0 :(得分:1)

假设您的数据如下:

In [107]: data = pd.DataFrame({
   .....:     'Customer ID': pd.np.random.randint(0, 5, 10),
   .....:     'Date Offered': pd.Series(pd.np.random.randint(1429449000, 1429649000, 10) * 1E9).astype('datetime64[ns]'),
   .....:     'Date Accepted': pd.Series(pd.np.random.randint(1429449000, 1429649000, 10) * 1E9).astype('datetime64[ns]'),
   .....: })

In [108]: data.loc[data['Date Offered'] >= data['Date Accepted'], 'Date Accepted'] = None

In [109]: data
Out[109]:
   Customer ID       Date Accepted        Date Offered
0            2                 NaT 2015-04-21 14:04:45
1            2 2015-04-20 15:33:27 2015-04-20 00:25:48
2            2 2015-04-21 11:02:22 2015-04-20 17:09:48
3            1 2015-04-20 12:26:38 2015-04-19 15:22:32
4            1                 NaT 2015-04-21 07:19:44
5            0 2015-04-21 20:38:08 2015-04-21 13:55:29
6            1 2015-04-20 11:39:11 2015-04-19 16:42:37
7            2                 NaT 2015-04-21 14:45:51
8            4                 NaT 2015-04-20 07:26:14
9            3 2015-04-21 15:24:20 2015-04-21 03:44:49

您可以找到第一次接受和第一次报价之间的差异,如下所示:

In [110]: groups = data.groupby('Customer ID')

In [111]: diff = groups['Date Accepted'].min() - groups['Date Offered'].min()

In [112]: diff
Out[112]:
Customer ID
0   06:42:39
1   20:16:39
2   15:07:39
3   11:39:31
4        NaT
dtype: timedelta64[ns]

可以使用以下方法将其作为列添加到数据中:

In [113]: data['Diff'] = data['Customer ID'].map(diff)

In [114]: data
Out[114]:
   Customer ID       Date Accepted        Date Offered     Diff
0            2                 NaT 2015-04-21 14:04:45 15:07:39
1            2 2015-04-20 15:33:27 2015-04-20 00:25:48 15:07:39
2            2 2015-04-21 11:02:22 2015-04-20 17:09:48 15:07:39
3            1 2015-04-20 12:26:38 2015-04-19 15:22:32 20:16:39
4            1                 NaT 2015-04-21 07:19:44 20:16:39
5            0 2015-04-21 20:38:08 2015-04-21 13:55:29 06:42:39
6            1 2015-04-20 11:39:11 2015-04-19 16:42:37 20:16:39
7            2                 NaT 2015-04-21 14:45:51 15:07:39
8            4                 NaT 2015-04-20 07:26:14      NaT
9            3 2015-04-21 15:24:20 2015-04-21 03:44:49 11:39:31

答案 1 :(得分:0)

因为我不确定我是否完全理解您的数据帧,所以只需要注意一下。假设您的数据框为df,其列为['ID', 'OfferDate', 'AcceptDate']

def func(group):
    group = group[~group['AcceptDate'].isnull()]
    group = group.sort('AcceptDate')
    first = group.iloc[0]
    first_elapsed = first['AcceptDate'] - first['OfferDate']
    return first_elapsed

df.groupby('ID').apply(func)