我确定这是一个基本问题,但我无法在此找到正确的路径。
让我们假设一个这样的数据框,告诉每个人每周吃多少水果:
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
操作的第一部分:
因此,首先,groupby将DataFrame
转换为DataFrameGroupBy
对象。然后,使用诸如sum
之类的方法,将结果合并到一个新的DataFrame
对象中。完美,我现在可以创建我的水果情节了。
但我遇到的问题是当我不想sum
,diff
或根据每个群组成员应用任何操作时会发生什么。当我只想使用groupby
来保持DataFrame
每个水果类型只有一行时会发生什么(当然,对于一个像这个简单的例子,我可以得到一个水果列表unique
,但这不是重点。
如果我这样做,则返回groupby
是DataFrameGroupBy
个对象,许多与DataFrame
一起使用的操作不会与DataFrameGroupBy
一起使用。
这个问题,我确信它很容易避免,给我带来很多麻烦。如何在不需要应用任何聚合功能的情况下从DataFrame
获取groupby
?是否有一个不同的解决方法,甚至没有使用groupby
因为在翻译中丢失而我遗失了?
答案 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