python根据一个复杂的标准删除列中的重复项并保留行

2024-04-19 23:10:22 发布

您现在位置:Python中文网/ 问答频道 /正文

假设我有这个DF:

s1 = pd.Series([1,1,2,2,2,3,3,3,4])
s2 = pd.Series([10,20,10,5,10,7,7,3,10])
s3 = pd.Series([0,0,0,0,1,1,0,2,0])
df = pd.DataFrame([s1,s2,s3]).transpose()
df.columns = ['id','qual','nm']
df
   id  qual  nm
0   1    10   0
1   1    20   0
2   2    10   0
3   2     5   0
4   2    10   1
5   3     7   1
6   3     7   0
7   3     3   2
8   4    10   0

我想得到一个新的DF,其中没有重复的id,因此应该有4行id为1,2,3,4。应该保留的行应该根据以下标准选择:取nm最小的一行,如果相等,取qual最大的一行,如果仍然相等,只选择一行。 我想我的代码应该是这样的:

df.groupby('id').apply(lambda x: ???)

它应该返回:

   id  qual  nm
0   1    20   0
1   2    10   0
2   3     7   0
3   4    10   0

但不确定我的函数应该接受什么并返回什么。
或者有更简单的方法?
谢谢


Tags: columns代码iddataframedf标准s3series
2条回答

使用-

grouper = df.groupby(['id'])
df.loc[(grouper['nm'].transform(min) == df['nm'] ) & (grouper['qual'].transform(max) == df['qual']),:].drop_duplicates(subset=['id'])

输出

   id  qual  nm
1   1    20   0
2   2    10   0
6   3     7   0
8   4    10   0

使用^{}^{}表示每个组的最小行数,然后使用^{}表示最大值和last if still dups将它们删除:

#get minimal nm
df1 = df[df['nm'] == df.groupby('id')['nm'].transform('min')]
#get maximal qual    
df1 = df1[df1['qual'] == df1.groupby('id')['qual'].transform('max')]
#if still dupes get first id
df1 = df1.drop_duplicates('id')
print (df1)
   id  qual  nm
1   1    20   0
2   2    10   0
6   3     7   0
8   4    10   0

相关问题 更多 >