使用Pandas的groupby只是为了删除重复的项目

2024-04-20 01:19:44 发布

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

我确信这是一个基本问题,但我在这里找不到正确的路径。在

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

    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来保持每个水果类型只有一行的{}时会发生什么情况(当然,对于这样一个简单的例子,我可以得到一个带有unique的水果列表,但这不是重点)。在

如果我这样做,groupby的返回是一个DataFrameGroupBy对象,而许多使用DataFrame的操作都不使用DataFrameGroupBy。在

这个问题,我相信很容易避免,让我很头疼。如何从groupby获得DataFrame,而不必应用任何聚合函数?有没有一个不同的解决方法,甚至没有使用groupby,因为我在翻译中丢失了它?在


Tags: 数据对象方法路径dataframelemonbananacherry
3条回答

这一点让我觉得这可能是你想要的答案:

Is there a different workaround without even using 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更快、更可读。在

IIUC您可以使用^{},它将返回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参数:

^{pr2}$

如果您不希望您的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

如果您只需要一些行,可以使用^{}-^{}+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

相关问题 更多 >