【问题标题】:Adding first date instances to a new column in pandas dataframe将第一个日期实例添加到熊猫数据框中的新列
【发布时间】:2015-04-23 02:38:12
【问题描述】:

我是 Pandas 的新手,我有一个 Pandas 数据框,其中包含三列(每列有数千行):

  1. 客户 ID 号(按升序排序),如果某些客户收到多个报价/接受多个报价,则为多个 ID(dtype:int)
  2. 向每位客户提供报价的日期和时间(dtype : datetime64[ns])
  3. 如果客户接受第 2 列中的报价,则为数据和时间,否则为 NaT。

我想做的是首先从第 2 列中找到向每个唯一客户提供的最早报价的日期,然后找到每个客户接受报价的最早日期(如果有的话)(=第 3 列有日期),并从首次接受报价的日期中减去首次向客户提供报价的日期。

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

我尝试了各种方法,使用 pandas 的 .map 和 lambda,创建辅助列和各种函数,但似乎无法弄清楚。

有没有一种优雅的方式来做到这一点?

任何帮助表示赞赏。

【问题讨论】:

  • 您能否展示一个数据子集的示例?
  • 澄清一下,您想要从第一次接受到第一次要约的时间还是从第一次接受到提出特定要约的时间?

标签: python pandas


【解决方案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

第一次接受和第一次offer的区别如下:

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

【讨论】:

  • 非常感谢,这正是我的数据集的样子和我正在寻找的答案。
【解决方案2】:

只是试一试,因为我不确定我是否完全理解您的数据框。假设您的数据框是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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-01
    • 2021-07-25
    • 2020-11-28
    • 2016-09-08
    • 1970-01-01
    • 2019-10-27
    • 2022-12-14
    • 1970-01-01
    相关资源
    最近更新 更多