熊猫:条件和与分组依据

时间:2020-06-12 16:14:16

标签: python pandas sum

我已经几次发现这个问题,但是我似乎无法针对我的具体情况给出答案,所以我希望有人可以帮助我。

我有下表(如果我确实尝试过,如果看起来不正确,我深表歉意):

ID  Reservation_Date  Booking_Date  Pax
0   2020-06-12        2020-06-04    4
1   2020-06-12        2020-06-04    5
2   2020-06-12        2020-06-04    2
3   2020-06-12        2020-06-09    5
4   2020-06-11        2020-06-02    6
5   2020-06-11        2020-06-02    1
6   2020-06-11        2020-06-10    3
7   2020-06-11        2020-06-10    5

可以通过以下方式生成:

    data = {
    'Reservation Date' : ['2020-06-12', '2020-06-12', '2020-06-12', '2020-06-12', '2020-06-11','2020-06-11', '2020-06-11', '2020-06-11'],
    'Booking Date' : ['2020-06-04', '2020-06-04', '2020-06-04', '2020-06-09', '2020-06-02', '2020-06-02', '2020-06-10', '2020-06-10'], 
    'Pax' : [4,5,2,5,6,1,3,5]
    }

df = pd.DataFrame (data, columns = ['Reservation Date','Booking Date','Pax'])

我想要实现的是对pax进行汇总,并按预订日期分组,但仅在预订日期与预订日期之间的差值等于或大于7的情况下。

有2个输出我会很满意。

  1. 是列保留日期的汇总,每个日期包含1条记录,考虑到预订日期,为该日期保留的pax总和必须在保留日期之前7天或更长时间< / p>

  2. 记录相同的地方,但有一列增加了pax的总和(与选项1相同),但它在不同的行上表示相同保留日期的总和。

    < / li>

在预订日期前7天没有预订的人数的日期,该人数必须为0。

因此,选项1的示例输出为:

ID  Reservation_Date  Booking_Date  Pax
0    2020-06-12       2020-06-04    11
1    2020-06-11       2020-06-02    7

和选项2:

ID  Reservation_Date  Booking_Date  Pax  Pax_Agg
0   2020-06-12        2020-06-04    4    11
1   2020-06-12        2020-06-04    5    11
2   2020-06-12        2020-06-04    2    11
3   2020-06-12        2020-06-09    5    11
4   2020-06-11        2020-06-02    6    7
5   2020-06-11        2020-06-02    1    7
6   2020-06-11        2020-06-10    3    7
7   2020-06-11        2020-06-10    5    7

我已经尝试使用以下方法创建布尔值“ cond”:

df['cond'] = (df['Reservation_Date']-df['Booking_Date']).dt.components.days >7

并将其用作我的groupby的输入,但是我无法使其正常工作。

希望有人可以帮助我!

1 个答案:

答案 0 :(得分:0)

使用astype将日期列设置为日期。然后,您可以使用遮罩过滤数据框。最后,按预订日期分组并汇总您的目标列:

import pandas as pd

data = {
'Reservation Date' : ['2020-06-12', '2020-06-12', '2020-06-12', '2020-06-12', '2020-06-11','2020-06-11', '2020-06-11', '2020-06-11'],
'Booking Date' : ['2020-06-04', '2020-06-04', '2020-06-04', '2020-06-09', '2020-06-02', '2020-06-02', '2020-06-10', '2020-06-10'],
'Pax' : [4,5,2,5,6,1,3,5]
}

df = pd.DataFrame (data, columns = ['Reservation Date','Booking Date','Pax'])
df = df[df['Reservation Date'].astype('datetime64[ns]') >= df['Booking Date'].astype('datetime64[ns]') + pd.Timedelta(7, unit='D')]
df = df.groupby(['Reservation Date'])['Pax'].agg('sum')
print(df)