使用Panda的小组来删除重复的项目

时间:2016-02-19 08:14:32

标签: python pandas

我确定这是一个基本问题,但我无法在此找到正确的路径。

让我们假设一个这样的数据框,告诉每个人每周吃多少水果:

    Name    Fruit    Amount
1   Jack    Lemon    3
2   Mary    Banana   6
3   Sophie  Lemon    1
4   Sophie  Cherry   10
5   Daniel  Banana   2
6   Daniel  Cherry   4

现在假设我只想用matplotlib创建一个条形图,以显示整个城镇每周吃掉的每个水果的总量。要做到这一点,我必须用水果组合

在他的书中,pandas作者将groupby描述为split-apply-combine操作的第一部分: enter image description here 因此,首先,groupby将DataFrame转换为DataFrameGroupBy对象。然后,使用诸如sum之类的方法,将结果合并到一个新的DataFrame对象中。完美,我现在可以创建我的水果情节了。

但我遇到的问题是当我不想sumdiff或根据每个群组成员应用任何操作时会发生什么。当我只想使用groupby来保持DataFrame每个水果类型只有一行时会发生什么(当然,对于一个像这个简单的例子,我可以得到一个水果列表unique,但这不是重点。

如果我这样做,则返回groupbyDataFrameGroupBy个对象,许多与DataFrame一起使用的操作不会与DataFrameGroupBy一起使用。

这个问题,我确信它很容易避免,给我带来很多麻烦。如何在不需要应用任何聚合功能的情况下从DataFrame获取groupby?是否有一个不同的解决方法,甚至没有使用groupby因为在翻译中丢失而我遗失了?

3 个答案:

答案 0 :(得分:4)

如果您只想要一些行,则可以使用groupby-first() + reset_index的组合 - 它将保留每组的第一行:

import pandas as pd

df = pd.DataFrame({'a': [1, 1, 2], 'b': [1, 2, 3]})
>>> df.groupby(df.a).first().reset_index()
    a   b
0   1   1
1   2   3

答案 1 :(得分:1)

这一点让我觉得这可能是你正在寻找的答案:

  

是否有不同的解决方法,甚至没有使用groupby

如果您只想删除基于Fruit的重复行,.drop_duplicates即可。

df.drop_duplicates(subset='Fruit')

     Name   Fruit  Amount
1    Jack   Lemon       3
2    Mary  Banana       6
4  Sophie  Cherry      10

您对保留哪些行的控制有限,请参阅docstring。

这比groupby + first更快,更易读。

答案 2 :(得分:0)

IIUC你可以使用pivot_table,它将返回DataFrame

In [140]: df.pivot_table(index='Fruit')
Out[140]:
        Amount
Fruit
Banana       4
Cherry       7
Lemon        2

In [141]: type(df.pivot_table(index='Fruit'))
Out[141]: pandas.core.frame.DataFrame

如果你想保留第一个元素,你可以定义你的函数并将其传递给aggfunc参数:

In [144]: df.pivot_table(index='Fruit', aggfunc=lambda x: x.iloc[0])
Out[144]:
        Amount    Name
Fruit
Banana       6    Mary
Cherry      10  Sophie
Lemon        3    Jack

如果您不希望自己的Fruit成为索引,也可以使用reset_index

In [147]: df.pivot_table(index='Fruit', aggfunc=lambda x: x.iloc[0]).reset_index()
Out[147]:
    Fruit  Amount    Name
0  Banana       6    Mary
1  Cherry      10  Sophie
2   Lemon       3    Jack