Groupby之后的多索引,如果只有一个组,则应用

2024-10-06 12:27:38 发布

您现在位置:Python中文网/ 问答频道 /正文

如果某些行(按“trn_crd_no”和“loc_code”分组)满足条件(操作之间的差异小于5分钟),我将尝试设置为True或False

如果有多个组,一切正常,但当只有一个组['trn_crd_no'、'loc_code']时失败

BBDD_赞助人1:

    trn_id          trn_date  loc_code  trn_crd_no  prd_acc_no
0        1  28/05/2019 10:29     20004        1111          32
1        2  28/05/2019 10:30     20004        1111         434
2        3  28/05/2019 10:35     20004        1111          24
3        4  28/05/2019 10:37     20004        1111        6453
4        5  28/05/2019 10:39     20004        1111        5454
5        6  28/05/2019 10:40     20004        1111        2132
6        7  28/05/2019 10:41     20004        1111          45
7        8  28/05/2019 13:42     20007        2222         867
8        9  28/05/2019 13:47     20007        2222         765
9       19  28/05/2019 13:54     20007        2222        2334
10      11  28/05/2019 13:56     20007        2222        3454
11      12  28/05/2019 14:03     20007        2222          23
12      13  28/05/2019 15:40     20007        2222         534
13      14  28/05/2019 15:45     20007        2222          13
14      15  28/05/2019 17:05     20007        2222         765
15      16  28/05/2019 17:08     20007        2222          87
16      17  28/05/2019 14:07     10003        2222        4526
#Set trn_date is datetime
BBDD_Patron1['trn_date'] = pd.to_datetime(BBDD_Patron1['trn_date'])

aux = BBDD_Patron1.groupby(['trn_crd_no', 'loc_code'], as_index=False).apply(lambda x: x.trn_date.diff().fillna(0).abs() < pd.Timedelta(5))

辅助:

0  0      True
   1     False
   2     False
   3     False
   4     False
   5     False
   6     False
1  16     True
2  7      True
   8     False
   9     False
   10    False
   11    False
   12    False
   13    False
   14    False
   15    False

从第一个DF副本创建新的DF副本,并使用布尔值包含新列

BBDD_Patron1_v = BBDD_Patron1.copy()
BBDD_Patron1_v['consec'] = aux.reset_index(level=0, drop=True)

结果如预期。 BBDD_用户1_v:

    trn_id            trn_date  loc_code  trn_crd_no  prd_acc_no  consec
0        1 2019-05-28 10:29:00     20004        1111          32    True
1        2 2019-05-28 10:30:00     20004        1111         434   False
2        3 2019-05-28 10:35:00     20004        1111          24   False
3        4 2019-05-28 10:37:00     20004        1111        6453   False
4        5 2019-05-28 10:39:00     20004        1111        5454   False
5        6 2019-05-28 10:40:00     20004        1111        2132   False
6        7 2019-05-28 10:41:00     20004        1111          45   False
7        8 2019-05-28 13:42:00     20007        2222         867    True
8        9 2019-05-28 13:47:00     20007        2222         765   False
9       19 2019-05-28 13:54:00     20007        2222        2334   False
10      11 2019-05-28 13:56:00     20007        2222        3454   False
11      12 2019-05-28 14:03:00     20007        2222          23   False
12      13 2019-05-28 15:40:00     20007        2222         534   False
13      14 2019-05-28 15:45:00     20007        2222          13   False
14      15 2019-05-28 17:05:00     20007        2222         765   False
15      16 2019-05-28 17:08:00     20007        2222          87   False
16      17 2019-05-28 14:07:00     10003        2222        4526    True

问题:如果我在groupby之后只有一个组:

BBDD_2:

   trn_id            trn_date  loc_code  trn_crd_no  prd_acc_no
0       1 2019-05-28 10:29:00     20004        1111          32
1       2 2019-05-28 10:30:00     20004        1111         434
2       3 2019-05-28 10:35:00     20004        1111          24
3       4 2019-05-28 10:37:00     20004        1111        6453
4       5 2019-05-28 10:39:00     20004        1111        5454
5       6 2019-05-28 10:40:00     20004        1111        2132
6       7 2019-05-28 10:41:00     20004        1111          45

aux2:

trn_date                0      1      2      3      4      5      6
trn_crd_no loc_code                                                
1111       20004     True  False  False  False  False  False  False

由于aux的STRUCTURE不同,因此我在以下行中得到一个错误:

BBDD_Patron1_v['consec'] = aux.reset_index(level=0, drop=True)

ValueError: Wrong number of items passed 7, placement implies 1

我还试图设置squese=True,但它也给出了不同的结构,因此我无法将布尔值复制到BBDD_Patron1中

aux = BBDD_Patron1.groupby(['trn_crd_no', 'loc_code'], squeeze=True).apply(lambda x: x.trn_date.diff().fillna(0).abs() < pd.Timedelta(5))

结果当超过一组时。辅助=

trn_crd_no  loc_code    
1111        20004     0      True
                      1     False
                      2     False
                      3     False
                      4     False
                      5     False
                      6     False
2222        10003     16     True
            20007     7      True
                      8     False
                      9     False
                      10    False
                      11    False
                      12    False
                      13    False
                      14    False
                      15    False

结果只有一组。Aux2=

0     True
1    False
2    False
3    False
4    False
5    False
6    False

Tags: noidfalsetruedatecodelocpd