【问题标题】:Error "Cannot access callable attribute 'sample' of 'DataFrameGroupBy' objects, try using the 'apply' method"错误“无法访问 'DataFrameGroupBy' 对象的可调用属性 'sample',请尝试使用 'apply' 方法”
【发布时间】:2021-01-31 11:47:52
【问题描述】:

模拟数据:

df = pd.DataFrame({
        'id': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10],
        'country': ['USA', 'USA', 'USA', 'USA', 'USA', 'Canada', 'Canada', 'Canada', 'USA', 'Canada']
})

假设我想为每个国家/地区抽取一个观察值:

df.groupby('country').sample(1)

我收到此错误:

AttributeError: Cannot access callable attribute 'sample' of 'DataFrameGroupBy' objects, try using the 'apply' method

我尝试重置索引,但没有解决问题。我也试过答案here,没用。我做错了什么?

编辑:这个问题有后续here

【问题讨论】:

  • 您只想要一个每个国家/地区有 1 行的数据框吗?随机行?第一行?具有最大 id 的行?
  • 我想要每个国家的随机数 n 行。但是我的问题在这里很笼统:为什么函数 DataFrameGroupBy.sample 不能按预期工作?见文档:pandas.pydata.org/pandas-docs/stable/reference/api/…
  • 你用的是什么熊猫版本?
  • @johnjohn groupby.sample 在 pandas version 1.1.0. 中引入,因此您可能需要升级 pandas。
  • 没错,使用版本'1.2.0',您的代码可以正常工作。

标签: python pandas sampling


【解决方案1】:

根据错误使用apply()group_keys=False 将删除 country 的附加索引。

>>> df.groupby('country', group_keys=False).apply(lambda df: df.sample(1))
   id country
6   7  Canada
2   3     USA

编辑: 似乎是熊猫版本不匹配,因为groupby 是在version 1.1.0 中引入的。我运行了 OPs 代码,它也能正常工作。

您需要使用pip3 install --upgrade pandas升级熊猫

【讨论】:

  • 好的,谢谢,但是为什么函数 DataFrameGroupBy.sample 不能按预期工作,请参见此处:pandas.pydata.org/pandas-docs/stable/reference/api/…?此外,在我看来,您的解决方案总是返回相同的行。我需要一个随机样本。
  • 随机我测试了,多试几次。实际上,您的代码也可以正常工作。我刚试了一下。你用的是什么版本的熊猫?我正在使用1.2.1
  • 非常感谢,确实是版本问题。还有一个问题:我还希望每个国家/地区的行数不同(例如美国为 4,加拿大为 2):我尝试过: df.groupby("country").sample(n=[4, 2])但它没有用。你能帮忙吗(请使用我的方法而不是 lambda,并指定 n 而不是权重)?
  • @johnjohn 我不太确定我是否会建议为此创建另一个问题。你也能接受我的回答吗?
猜你喜欢
  • 2019-01-17
  • 2018-11-01
  • 1970-01-01
  • 2020-05-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多