如何在 Pandas 中删除满足特定条件的某些行

3

我正在使用 pandas,我有一些数据集,看起来像这样:

ID-cell    TOWNS      NumberOfCrimes
 1          Paris       444
 1          Berlin      333
 1          London      111        
 2          Paris       222
 2          London      555
 2          Berlin      3
 3          Paris       999
 4          Berlin      777
 4          Paris       5
 5          Paris       123
 5          Berlin      8
 6          Paris       1000
 9          Berlin      321
 12         Berlin      1
 12         Berlin      2
 12         Paris       1

        . . .

这是一个非常庞大的数据集。我需要为每个城市保留仅有的5行最高犯罪率的记录,其余记录需要删除。

因此,我的输出应该如下所示:

ID-cell    TOWNS      NumberOfCrimes
 6          Paris       1000
 3          Paris       999     
 1          Paris       444
 2          Paris       222
 5          Paris       123

 4          Berlin      777
 1          Berlin      333
 9          Berlin      321
 5          Berlin      8

 1          London      555        
 2          London      111

非常感谢您的帮助。我是新手,正在为学院做一些项目,而我的截止日期非常接近。 :/

2个回答

3

sort + groupby.head

你可以按照 NumberOfCrimes 降序排序,然后使用 groupbyhead。以下是一个示例,从数据中提取每个城镇的最高 NumberOfCrimes。

res = df.sort_values('NumberOfCrimes', ascending=False)\
        .groupby('TOWNS').head(1)

print(res)

   ID-cell   TOWNS  NumberOfCrimes
5        3   Paris             999
4        2  London             555
1        1  Berlin             333

因此,对于每个城镇的前2或3名,您可以使用head(2)head(3)等。


@Neven,没问题。请注意,如果您只需要排名第一的解决方案,则温的解决方案更好。这个解决方案更具可扩展性。 - jpp
你的解决方案更适合我需要的,但他的解决方案也很好。 :) - Neven

2
使用
df.sort_values('NumberOfCrimes').drop_duplicates('ID-cell',keep='last')
Out[404]: 
   ID-cell   TOWNS  NumberOfCrimes
0        1   Paris             444
4        2  London             555
5        3   Paris             999

我认为只保留顶部的解决方案更好。 - jpp
非常感谢你们两位。 :) 我可以接受两个答案作为正确吗? - Neven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接