【问题标题】:How to get a subset of rows from every group如何从每个组中获取行的子集
【发布时间】:2014-03-02 10:22:37
【问题描述】:

给定一个 pandas DataFrame 的 groupby 对象 by_name,我希望能够从每个组中选择 n 行。

我希望.tail() 函数可以做到这一点,但它失败了。

d = {
    'name': ['Tom', 'John', 'Tom', 'Tom', 'John'],
    'age': [18,54,27,44,12]
}

df = pd.DataFrame(d)

by_name = df.groupby('name') 
two_rows_each = by_name.tail(2)

好吧,它确实选择了我想要的行数,但我不能在这个新对象上应用size() 方法。

print two_rows_each.size()

提高AttributeError: 'DataFrame' object has no attribute 'size'

虽然我可以在原来的groupby上使用size()by_name

name
John    2
Tom     3
dtype: int64

我需要两者,从分组对象中选择 X 行,然后获取组的大小。

有什么建议吗?

【问题讨论】:

  • 您希望得到什么?
  • 一个 groupby 对象,每个组中只有两次出现(给定上面的代码),这样我就可以使用 size() 方法了。
  • 错误状态下没有size,你在shape之后吗?
  • 为什么没有size? by_name 对象确实有大小,并且本身是相同的
  • @nutship 不影响数据框没有size 属性或方法这一事实,您必须使用shape,它们是完全不同的对象类型

标签: python group-by pandas


【解决方案1】:

好的,我想我理解你了,试试这个:

import pandas as pd
d = {
    'name': ['Tom', 'John', 'Tom', 'Tom', 'John','Mike'],
    'age': [18,54,27,44,12,90]
}

df = pd.DataFrame(d)
df1 = df.groupby('name').tail(2)
print df1.groupby('name').size()

刚刚添加 Mike 以在末尾至少获得一个不同于 2 的值 ;)

【讨论】:

  • 谢谢,这似乎是我需要的。奇怪的是,我后来在我的代码中得到了AssertionError(),我必须检查是什么原因造成的,稍后会回来接受这个。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-12-28
  • 2019-04-09
  • 2015-07-08
  • 2013-06-03
  • 1970-01-01
  • 2021-03-23
相关资源
最近更新 更多