使用一列对值进行分组,并使用pandas dataframe在其他列中返回具有最大值的值

时间:2017-10-17 11:26:52

标签: python pandas sorting dataframe group-by

以下是我的数据框示例:

revisionId  | itemId    | wikidataType
290397666   | 23        | Q5
307190482   | 23        | Q5
292002833   | 80        | Q5
292428272   | 80        | Q5
305018745   | 80        | Q5
305018964   | 80        | Q5
305019084   | 80        | Q5
301731639   | 181       | Q5
303692414   | 181       | Q5
306600439   | 192       | Q5
294596767   | 206       | Q5
294597048   | 206       | Q5

我想使用itemId列对元素进行分组,并为每个具有最大revisionId的项返回一行。我已经根据wikidataType,itemId和revisionId对它们进行了排序。以下是我希望我的数据框看起来像:

revisionId  | itemId    | wikidataType
307190482   | 23        | Q5
305019084   | 80        | Q5
303692414   | 181       | Q5
306600439   | 192       | Q5
294597048   | 206       | Q5

此外,此处此wikidataType列仅包含一个值“Q5”。但在整个数据框架中,有100种不同的类型。但这可能不是问题,因为我可以迭代这100种类型,因为我已经修复了它们的值。有没有人对此有所了解? 提前谢谢。

1 个答案:

答案 0 :(得分:1)

需要sort_values + drop_duplicates,其中包含用于检查dupes的选择列,并且只保留最后一个值:

df = (df.sort_values(by=['wikidataType', 'itemId', 'revisionId']) 
        .drop_duplicates(['itemId','wikidataType'], keep='last'))
print (df)
    revisionId  itemId wikidataType
1    307190482      23           Q5
6    305019084      80           Q5
8    303692414     181           Q5
9    306600439     192           Q5
11   294597048     206           Q5