我想保留具有最高"得分;起始值列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
中的值是否连续,如果连续,则它们属于同一组。在这个组中,我们想要过滤score
是max
的行。我会这样做:
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
这里发生了什么:
- 我使用
start
列创建一列,并向下移动所有值 - 接下来我来看看两者之间的区别。如果差值为
1
,则它们属于同一组,否则通过递增计数器创建一个新组。这将为我提供一个关于小组的新专栏 - 使用此选项,按分组并过滤
score
最大的位置