我有一个按帐户、姓名和日期分组的数据集。并创建一个函数,只保留每个唯一组合的'alt_fee'的最小值
def drop(df):
return df[df['alt_fee']==df['alt_fee'].min()]
result = df.groupby(['account', 'name', 'date']).apply(drop)
这给了我比需要更多的行。对于每个唯一的帐户、姓名和日期组合,我可以看到多个条目。我不知道为什么。在它生成的数据框中,索引、帐户、名称和日期中的列。有几个是一模一样的。但是我看到数值指标是不同的。也许有办法在分组前删除索引
我注意到,当我把这段代码放入function:
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')