首先,我有一个包含以下列的数据框:
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的长度等于数据框中组的数量。
鉴于数据,我想知道如何按组执行此减法或过滤。我是否必须以某种方式迭代数据框?
答案 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组中较小的日期并没有幸存下来。
希望这有用,并且如果遵循你想要的相同逻辑。