grouopby.apply 函数没有产生正确的结果

grouopby.apply function isnt producing correct result

我有一个按帐户、姓名和日期分组的数据集。并创建一个函数以仅保留每个唯一组合的 'alt_fee' 的最小值。

def drop(df):
   return df[df['alt_fee']==df['alt_fee'].min()]
result = df.groupby(['account', 'name', 'date']).apply(drop)

这给了我比需要更多的行。对于每个唯一的帐户、名称和日期组合,我可以看到多个条目。我不确定为什么。 在它生成的数据框中,索引、帐户、名称和日期中的列。有一些是相同的。但我看到数字索引不同。也许有一种方法可以在分组前删除索引。

我注意到当我将这段代码放入函数中时:

def drop(df):
    return df['alt_fee'].min()

它返回我想要的特定行。但是后来我不知道如何取回数据帧的其余部分。

您完全可以不使用 apply() 来完成此操作。使用groupby函数时,每个组合只会返回一条记录。通过使用 min() 作为聚合器,将返回数据中所有其他数字字段的最小值。

result = df.groupby(['account', 'name', 'date']).min()

处理评论

您可以只取上面代码中的 alt_fee 列,然后将其与原始数据集合并。

result = df.groupby(['account', 'name', 'date']).min()[['alt_fee']].reset_index()
result = result.merge(df, on=['account', 'name', 'date', 'alt_fee'])

注意:如果有多行具有相同的alt_fee,您需要删除重复项

result = result.drop_duplicates(['account', 'name', 'date', 'alt_fee'], keep='first')` to remove those values.

刚收到。这是代码,以防其他人卡在这里。

def drop(df):
    return df[df['alt_fee'] == df['alt_fee'].min()].drop_duplicates(subset=(['account', 'name','date']),keep='first')