在熊猫队中连续几周获得最长连胜纪录

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在熊猫队中连续几周获得最长连胜纪录相关的知识,希望对你有一定的参考价值。

目前我正在处理不同科目的每周数据,但它可能有一些没有数据的长条纹,所以,我想做的是,每个id保持连续几周的最长条纹。我的数据如下:

id    week
1      8
1      15
1      60
1      61
1      62
2      10
2      11
2      12
2      13
2      25
2      26

我的预期输出是:

id    week
1      60
1      61
1      62
2      10
2      11
2      12
2      13

我有点接近,试图用week == week.shift()+1标记为1。问题是这种方法不标记条纹中的第一次出现,而且我也无法过滤最长的一条:

df.loc[ (df['id'] == df['id'].shift())&(df['week'] == df['week'].shift()+1),'streak']=1

根据我的例子,这会带来这个:

id    week  streak
1      8     nan
1      15    nan
1      60    nan
1      61    1
1      62    1
2      10    nan
2      11    1
2      12    1
2      13    1
2      25    nan
2      26    1

关于如何实现我想要的任何想法?

答案

试试这个:

df['consec'] = df.groupby(['id',df['week'].diff(-1).ne(-1).shift().bfill().cumsum()]).transform('count')

df[df.groupby('id')['consec'].transform('max') == df.consec]

输出:

   id  week  consec
2   1    60       3
3   1    61       3
4   1    62       3
5   2    10       4
6   2    11       4
7   2    12       4
8   2    13       4
另一答案

不像@ScottBoston那样简洁,但我喜欢这种方法

def max_streak(s):
  a = s.values    # Let's deal with an array

  # I need to know where the differences are not `1`.
  # Also, because I plan to use `diff` again, I'll wrap
  # the boolean array with `True` to make things cleaner
  b = np.concatenate([[True], np.diff(a) != 1, [True]])

  # Tell the locations of the breaks in streak
  c = np.flatnonzero(b)

  # `diff` again tells me the length of the streaks
  d = np.diff(c)

  # `argmax` will tell me the location of the largest streak
  e = d.argmax()

  return c[e], d[e]

def make_thing(df):
  start, length = max_streak(df.week)
  return df.iloc[start:start + length].assign(consec=length)

pd.concat([
  make_thing(g) for _, g in df.groupby('id')    
])

   id  week  consec
2   1    60       3
3   1    61       3
4   1    62       3
5   2    10       4
6   2    11       4
7   2    12       4
8   2    13       4

以上是关于在熊猫队中连续几周获得最长连胜纪录的主要内容,如果未能解决你的问题,请参考以下文章

在 Postgres 中的连胜纪录

使用标准 SQL 的最长连续

按团队分组的基于赢、平和输的连续连胜/非连胜

如何使用 MySQL 计算最长的不败记录?

在一个无序整数数组中,找出连续增长片段最长的一段, 增长步长是1。Example: [3,2,4,5,6,1,9], 最长的是[4,5,6]

如何在熊猫中获得连续滚动平均值?