按某个列对数据框进行分组后,我想选择分组列中每个键的最后一个值之前的一年前六个月中的日期。 例如,在此数据框中
df = pd.DataFrame([
{'id': 'thing 1', 'date': '2016-01-01', 'quantity': 1 },
{'id': 'thing 1', 'date': '2016-02-01', 'quantity': 1 },
{'id': 'thing 1', 'date': '2016-09-01', 'quantity': 1 },
{'id': 'thing 1', 'date': '2016-10-01', 'quantity': 1 },
{'id': 'thing 2', 'date': '2017-01-01', 'quantity': 2 },
{'id': 'thing 2', 'date': '2017-02-01', 'quantity': 2 },
{'id': 'thing 2', 'date': '2017-02-11', 'quantity': 2 },
{'id': 'thing 2', 'date': '2017-09-01', 'quantity': 2 },
{'id': 'thing 2', 'date': '2017-10-01', 'quantity': 2 },
])
df.date = pd.to_datetime(df.date, format="%Y-%m-%d")
df
我想选择thing 1
的前2行和thing 2
的前3行。
我可以找到每个id
的开始日期和结束日期:
df.groupby('id').date.max()-pd.DateOffset(years=1)
df.groupby('id').date.max()-pd.DateOffset(months=6)
但是我找不到在两者之间选择日期的方法。
我的最佳尝试(也是幼稚的尝试)在以下方面可能是错误的:
df[(df.groupby('id').date>(df.groupby('id').date.max()-pd.DateOffset(years=1))) & (df.groupby('id').date<(df.groupby('id').date.max()-pd.DateOffset(months=6)))]
可以理解地返回
TypeError:dtype = datetime64 [ns]与SeriesGroupBy之间的比较无效
答案 0 :(得分:2)
您可以使用groupby.transform
来获取每一行的最高日期。然后,我们用pd.DateOffset
减去6个月,最后将其与Series.lt
的每一行进行比较,less than
与<
相同:
max_date = df.groupby('id')['date'].transform('max') - pd.DateOffset(months=6)
df[df['date'].lt(max_date)]
# or df[df['date'] < max_date]
输出
id date quantity
0 thing 1 2016-01-01 1
1 thing 1 2016-02-01 1
4 thing 2 2017-01-01 2
5 thing 2 2017-02-01 2
6 thing 2 2017-02-11 2
答案 1 :(得分:0)
这可能是愚蠢的做法,但是...您可以根据现有日期在月份的df中添加新列。
df['MONTH'] = pd.DatetimeIndex(df['date']).month
它将在1月1日,2月2日等
然后在前六个月中过滤掉该列,其中|意味着或
df = df.loc[df['MONTH'] == 1]|[df['MONTH'] == 2]|[df['MONTH'] == 3]|[df['MONTH'] == 4]|[df['MONTH'] == 5]|[df['MONTH'] == 6]|