比较值与组 - 熊猫

时间:2017-05-23 13:31:50

标签: python pandas group-by filtering

首先,我有一个包含以下列的数据框:

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的长度等于数据框中组的数量

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

2 个答案:

答案 0 :(得分:1)

我认为您最好的选择是将原始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的调用是必要的,因为您无法合并数据框和系列。

希望有所帮助。

答案 1 :(得分: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_by 应用来执行您尝试的操作。首先,您确定要应用的功能。然后 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组中较小的日期并没有幸存下来。

希望这有用,并且如果遵循你想要的相同逻辑。