【问题标题】:Create new column based on groupby shift in pandas根据 pandas 中的 groupby shift 创建新列
【发布时间】:2020-04-28 19:56:09
【问题描述】:

我有一个如下图所示的数据框

Session      slot_num        Overbook     ID
s1           1               no           A
s1           2               no           B
s1           2               yes          B
s1           3               no           C
s1           4               no           D
s1           4               yes          D
s1           5               no           E
s1           6               no           F
s1           7               no           G
s2           1               no           A1
s2           2               no           B1
s2           2               no           C1
s2           3               yes          C1
s2           4               no           D1
s2           4               no           E1
s2           5               no           F1
s2           6               no           G1
s2           5               yes          G1

第一步: 从上面我想创建一个列 Overbook1,它是 Overbook 向上移动的版本,如下所示,groupby 会话。

现在我们得到

Session      slot_num        Overbook     ID    Overbook1
s1           1               no           A     no
s1           2               no           B     yes
s1           2               yes          B     no
s1           3               no           C     no
s1           4               no           D     yes
s1           4               yes          D     no
s1           5               no           E     no
s1           6               no           F     no
s1           7               no           G     no
s2           1               no           A1    yes   
s2           2               yes          A1    no
s2           2               no           K1    yes
s2           3               yes          K1    no
s2           4               no           D1    no
s2           4               no           L1    no
s2           5               no           S1    no
s2           6               no           G1    yes
s2           5               yes          G1    no

第二步:删除 Overbook == 'yes' 的行

最终预期输出:

Session      slot_num        Overbook     ID    Overbook1
s1           1               no           A     no
s1           2               no           B     yes
s1           3               no           C     no
s1           4               no           D     yes
s1           5               no           E     no
s1           6               no           F     no
s1           7               no           G     no
s2           1               no           A1    yes   
s2           2               no           K1    yes
s2           4               no           D1    no
s2           4               no           L1    no
s2           5               no           S1    no
s2           6               no           G1    yes

【问题讨论】:

    标签: pandas pandas-groupby


    【解决方案1】:

    使用DataFrameGroupBy.shift 过滤boolean indexing

    df['Overbook1'] = df.groupby('Session')['Overbook'].shift(-1, fill_value='no')
    
    df = df[df['Overbook'].ne('yes')]
    print (df)
        Session  slot_num Overbook  ID Overbook1
    0       s1         1       no   A        no
    1       s1         2       no   B       yes
    3       s1         3       no   C        no
    4       s1         4       no   D       yes
    6       s1         5       no   E        no
    7       s1         6       no   F        no
    8       s1         7       no   G        no
    9       s2         1       no  A1        no
    10      s2         2       no  B1        no
    11      s2         2       no  C1       yes
    13      s2         4       no  D1        no
    14      s2         4       no  E1        no
    15      s2         5       no  F1        no
    16      s2         6       no  G1       yes
    

    【讨论】:

    • 请看这个问题stackoverflow.com/questions/61496685/… 只有你的水平是可能的。我尝试了一些......它给出了所需输出的一半
    • @ALI - 不幸的是今天有点忙,所以我没有时间(对于这样复杂的解决方案,不幸的是),对不起:(
    • 哦,打扰到你了,真的很抱歉。非常感谢您的回复..
    【解决方案2】:

    第一步是创建一个新列:

    df['Overbook1'] = df.groupby('Session').Overbook\
        .apply(lambda s: s.shift(-1, fill_value='no'))
    

    第二个 - 只选择“想要”的行:

    df = df.query('Overbook == "no"')
    

    【讨论】:

      猜你喜欢
      • 2021-06-11
      • 2022-10-13
      • 1970-01-01
      • 2021-10-09
      • 2023-01-05
      • 1970-01-01
      • 2022-10-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多