【问题标题】:Pandas shift logic熊猫移位逻辑
【发布时间】:2023-01-09 21:19:43
【问题描述】:

我有一个像这样的数据框:

col1 customer
 1    a
 3    a
 1    b
 2    b
 3    b
 5    b

我希望逻辑是这样的:

col1 customer  col2
 1    a         1
 3    a         1
 1    b         1
 2    b         2
 3    b         3
 5    b         3

如您所见,如果客户在 col1 中具有一致的值,则给出它,如果没有,则给出最后一个一致的数字,即 3

我尝试使用 df.shift() 但我被卡住了

【问题讨论】:

  • 逻辑不清楚,你不是真的shift这里的值。你如何定义“一致”?你能分解结果吗?

标签: pandas


【解决方案1】:

你想要shift + bfill吗?

df['col2'] = df.groupby('customer')['col1'].shift().bfill(downcast='infer')

输出:

   col1 customer  col2
0     1        a     1
1     3        a     1
2     1        b     1
3     2        b     1
4     3        b     2
5     5        b     3

【讨论】:

    【解决方案2】:

    也许您想在当前值之后的下一行值时增加一个计数器:

    df['col2'] = df['col1'].eq(df['col1'].shift()+1).cumsum().add(1)
    print(df)
    
    # Output
       col1 customer  col2
    0     1        a     1
    1     3        a     1
    2     1        b     1
    3     2        b     2
    4     3        b     3
    5     5        b     3
    

    或者对于每个客户:

    inc_count = lambda x: x.eq(x.shift()+1).cumsum().add(1)
    df['col2'] = df['col2'] = df.groupby('customer')['col1'].apply(inc_count)
    print(df)
    
    # Output
       col1 customer  col2
    0     1        a     1
    1     3        a     1
    2     1        b     1
    3     2        b     2
    4     3        b     3
    5     5        b     3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-16
      • 2019-06-06
      • 1970-01-01
      • 2022-06-21
      • 2011-02-09
      • 2017-02-23
      • 2011-04-11
      • 2021-12-03
      相关资源
      最近更新 更多