2016-02-19 30 views
2

我敢肯定这是一个基本问题,但我无法找到正确的路径在这里。使用熊猫的群只是放弃重复的项目

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

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,显示每个总量在整个城镇每周吃水果。要做到这一点,我必须GROUPBY成果

在他的书中,熊猫笔者介绍groupby作为split-apply-combine操作的第一部分: enter image description here 所以,首先GROUPBY的变换DataFrameDataFrameGroupBy对象。然后,使用诸如sum之类的方法,将结果合并到新的DataFrame对象中。完美,我现在可以创造我的水果情节。

但是我面临的问题是当我不想sum,diff或者对所有组员都应用任何操作时会发生什么。当我只想用groupby来保留DataFrame每个水果类型只有一行时会发生什么(当然,对于这个例子来说简单,我可以得到一个unique的水果列表,但这不是重点) 。

如果我这样做,的groupby回报是DataFrameGroupBy对象,其中许多与DataFrame工作操作与DataFrameGroupBy没有。

这个问题,我敢肯定,它很容易避免,给我很多头痛的问题。我怎样才能从groupbyDataFrame而不必应用任何聚合函数?是否有不同的解决方法,甚至没有使用groupby,由于在翻译中丢失而丢失了这些信息?

+0

不清楚你在问什么。你的新数据框有什么列和值?我猜索引将由组键组成。 – Goyo

回答

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 
+0

为什么我需要使用reset_index?我正在测试它,在有和没有它的情况下,返回的类型是pandas.core.frame.DataFrame –

+0

哦,这里'reset_index'唯一的做法是“反转”groupby的原始效果。无论如何你都会得到一个DataFrame是正确的,但如果没有它,索引将成为'groupby'的参数。如果您对没有它的结果感到满意,只需省略它。 –

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 
+0

它似乎工作,但我想我会坚持groupby,因为使用pivot_table这个工作似乎有点棘手(至少如果我不想水果作为索引) –

1

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

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

如果你只是想删除重复d行基于Fruit,.drop_duplicates是要走的路。

df.drop_duplicates(subset='Fruit') 

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

您对保留哪些行的控制权有限,请参阅文档字符串。

这比groupby + first更快和更具可读性。