【问题标题】:Comparing values with groups - pandas将值与组进行比较 - 熊猫
【发布时间】:2017-10-23 11:53:24
【问题描述】:

首先,我有一个包含这些列的数据框:

issue_date | issue | special  |  group 

多行可以包含相同的group。对于每个组,我想得到它的最大日期:

date_current = history.groupby('group').agg({'issue_date' : [np.min, np.max]})
date_current = date_current.issue_date.amax

之后,我想通过max_date-months 过滤每个组

date_before  = date_current.values - pd.Timedelta(weeks=4*n)

即,对于每个组,我想丢弃 issue_date < date_before 列所在的行:

hh = history[history['issue_date'] > date_before]

ValueError:长度必须匹配才能比较

最后一行不起作用,因为长度不匹配。这是意料之中的,因为我的数据框中有 x 行,但 date_before 的长度等于我的数据框中的组数

给定数据,我想知道如何按组执行减法或过滤。我是否必须以某种方式迭代数据框?

【问题讨论】:

    标签: python pandas group-by filtering


    【解决方案1】:

    您可以通过与您尝试类似的方式解决此问题。

    我创建了自己的示例数据,如下所示:

    history
    
      issue_date  group
    0 2014-01-02      1
    1 2014-01-02      2
    2 2016-02-04      3
    3 2016-03-05      2
    

    你使用 group_byapply 来做你想做的事。首先,您定义要应用的功能。然后 group_by.apply 会将其应用于每个组。在这种情况下,我使用 n=1 来证明这一点:

    def date_compare(df):
    
        date_current = df.issue_date.max()
        date_before  = date_current - pd.Timedelta(weeks=4*1)
        hh = df[df['issue_date'] > date_before]
    
        return hh
    
    hh = history.groupby('group').apply(date_compare)
    
            issue_date  group
    group                    
    1     0 2014-01-02      1
    2     3 2016-03-05      2
    3     2 2016-02-04      3
    

    所以第 2 组中较小的日期没有幸免。

    希望这会有所帮助,并且它遵循您想要的相同逻辑。

    【讨论】:

      【解决方案2】:

      我认为您最好的选择是将原始 df 与 date_current 合并,但这仅在您更改 date_before 的计算以不丢失组信息时才有效:

      date_before  = date_current - pd.Timedelta(weeks=4*n)
      

      然后你可以合并左上组和右上索引(因为你之前分组过)

      history = pd.merge(history, date_before.to_frame(), left_on='group', right_index=True)
      

      那么您的过滤器应该可以工作了。 to_frame 的调用是必要的,因为您不能合并数据框和系列。

      希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-12-13
        • 1970-01-01
        相关资源
        最近更新 更多