将得分最高的行保留在列起始的范围内



我想保留具有最高"得分;起始值列3位内的值。我有一个像下面这样的数据帧:

data = {'id':['id1', 'id2', 'id3', 'id4', 'id5', 'id6'],
'start':[1,12,11,2,20,3],
'score':[3,1,8,2,5,9]}
df = pd.DataFrame(data, columns=['id', 'start',  'score'])
df = df.sort_values(by='start')

期望输出:

data = {'id':['id3', 'id5', 'id6'],
'start':[11,20,3],
'score':[8,5,9]}
output = pd.DataFrame(data, columns=['id', 'start',  'score'])
output = output.sort_values(by='start')

因为id1,id4,&id6的起始值加上或减去3,我们保留得分最高的行(id6(。id2&id3,其中id3被保留。id5是唯一的,应该保留。

你想要这个吗?-

bin = range(df['start'].min(), df['start'].max()+3, 3)
cut = pd.cut(df['start'], bins=bin, include_lowest= True)
def test(x):
return x.sort_values('score').tail(1)
df = df.groupby(cut).apply(test).reset_index(drop=True)

根据我的理解,我们需要检查start中的值是否连续,如果连续,则它们属于同一组。在这个组中,我们想要过滤scoremax的行。我会这样做:

cnt = 0
def group(x, y):
global cnt
if (x - y) > 1:
cnt += 1
return cnt
df['start_2'] = df['start'].shift(1).fillna(1)
df['group'] = df[['start', 'start_2']].apply(lambda x: group(x.start, x.start_2), axis=1)
df = df[df.groupby(['group'])['score'].transform(max) == df['score']]
df.drop(columns=['start_2'], inplace=True)
df

这里发生了什么:

  1. 我使用start列创建一列,并向下移动所有值
  2. 接下来我来看看两者之间的区别。如果差值为1,则它们属于同一组,否则通过递增计数器创建一个新组。这将为我提供一个关于小组的新专栏
  3. 使用此选项,按分组并过滤score最大的位置

最新更新