【问题标题】:subset by counting the number of times 0 occurs in a column after groupby in python通过计算0在python中groupby之后的列中出现的次数来实现子集
【发布时间】:2019-03-29 17:44:34
【问题描述】:

我有一些典型的股票数据。我想创建一个名为“Volume_Count”的列,它将计算每季度 0 卷天数。我的最终目标是在一个季度中删除所有 0 交易量超过 5 天的股票。通过创建此列,我可以编写一个简单的语句来设置 Vol_Count > 5 的子集。

一个典型的数据集:

Stock     Date      Qtr     Volume
 XYZ     1/1/19   2019 Q1     0
 XYZ     1/2/19   2019 Q1     598
 XYZ     1/3/19   2019 Q1     0 
 XYZ     1/4/19   2019 Q1     0
 XYZ     1/5/19   2019 Q1     0
 XYZ     1/6/19   2019 Q1     2195
 XYZ     1/7/19   2019 Q1     0
 ... ... and so on (for multiple stocks and quarters)

这是我尝试过的 - 1 班轮 -

df = df.groupby(['stock','Qtr'], as_index=False).filter(lambda x: len(x.Volume == 0) > 5) 

但是,如前所述,这会产生不一致的结果。

我只想从数据集中删除交易量 == 0 持续 5 天或更长时间的季度的股票。

注意:我的数据集中有多个 Stocks 和 Qtr,因此 groupby Qtr, Stock 是必不可少的。

期望的输出: 我想保留数据集,但如果 qtr 的任何股票的数量 = 0 > 5 天,则删除它们。这可能意味着 2019 年第一季度的股票不在数据集中(因为 Vol == 0 > 5 天)但是在 2019 年第二季度进入 df(Vol == 0

【问题讨论】:

  • 想要的结果是什么。
  • 更新了我的问题。 @pygo
  • @busybear 谢谢你的评论,你说得对,我的原始代码中有正确的不等式,只是在这里写错了。
  • 我认为您只需将不等式的方向更改为小于 5。您希望过滤器的值对于要保留的记录返回 True。因此,对于传递到filter 的每个组,您检查条件,如果结果评估为 True,它将保留该组中的所有记录。

标签: python pandas


【解决方案1】:

试试这个:

df[df['Volume'].eq(0).groupby([df['Stock'],df['Qtr']]).transform('sum') < 5]

详情。

  1. 首先获取数据框的 Volume 列并检查是否 每条记录为零。
  2. 接下来,将该列按“Stock”和“Qtr”列分组,并从步骤 1 中获取每个 True 值的总和,使用 groupbytransform 将该总和分配给每条记录。
  3. 从该总和创建布尔系列,如果小于 5,则为 True,并且 使用该系列对您的原始数据框进行布尔索引。

【讨论】:

  • 你能详细说明这里到底发生了什么吗? @斯科特波士顿。谢谢,我试试看!
  • 是的,这很好。 :) 我正在尝试使用 value_counts,看起来不太好。 :)
  • 一如既往的好斯科特。
  • 感谢 anky_91 和 pygo。
猜你喜欢
  • 2020-06-20
  • 1970-01-01
  • 1970-01-01
  • 2017-03-08
  • 1970-01-01
  • 2023-02-08
  • 2012-10-05
  • 2012-08-20
  • 1970-01-01
相关资源
最近更新 更多