首页 > 解决方案 > 定位一列中的值,然后使用相应的日期戳搜索其他列

问题描述

我有一个任务要解决,因为我尝试学习 Pandas,并且之前在这里发布了一个问题,但现在需要调整它以根据date搜索值,而不是根据 @jazrael 帮助我的行号倒数。

基本上我有一个如下的数据框: -

id    food     date        mood
id 1  nuts     2018-11-12  high
id 2  potatoes 2018-11-13  low
id 4  bread    2018-11-13  high
id 5  fish     2018-11-14  high
id 6  nuts     2018-11-14  high
id 7  fish     2018-11-15  allergies
id 8  beer     2018-11-16  low
id 9  bread    2018-11-17  high
id 10 fish     2018-11-18  high
id 11 pasta    2018-11-19  allergies

我希望在 'mood' 列中搜索 'allergies',然后使用我们找到值 'allergies' 的行上的 'date' 值倒数 2 天,并在 food 列中捕获所有相应的食物值(同时还检测到对行过敏的食品)。

因此生成的数据框可能如下所示(我将保留“日期”和“心情”列以便更好地理解问题):-

id    food     date        mood
id 2  potatoes 2018-11-13  low
id 3  fish     2018-11-13  high
id 4  bread    2018-11-13  high
id 5  fish     2018-11-14  high
id 6  nuts     2018-11-14  high
id 7  fish     2018-11-15  allergies
id 9  bread    2018-11-17  high
id 10 fish     2018-11-18  high
id 11 pasta    2018-11-19  allergies

非常感谢任何帮助!

麦克多尔

标签: pandaspandas-groupby

解决方案


解决方案与之前的答案类似,仅使用GroupBy.transformwith GroupBy.lastfor date for allergies,减去2days 和 filter by Series.gein boolean indexing

s = df['mood'].eq('allergies').iloc[::-1].cumsum()
df = df[df['date'].ge(df['date'].groupby(s).transform('last') - pd.Timedelta(2, unit='d'))]
print (df)
      id      food       date       mood
1   id 2  potatoes 2018-11-13        low
2   id 4     bread 2018-11-13       high
3   id 5      fish 2018-11-14       high
4   id 6      nuts 2018-11-14       high
5   id 7      fish 2018-11-15  allergies
7   id 9     bread 2018-11-17       high
8  id 10      fish 2018-11-18       high
9  id 11     pasta 2018-11-19  allergies

详情

print (df['date'].groupby(s).transform('last'))
0   2018-11-15
1   2018-11-15
2   2018-11-15
3   2018-11-15
4   2018-11-15
5   2018-11-15
6   2018-11-19
7   2018-11-19
8   2018-11-19
9   2018-11-19
Name: date, dtype: datetime64[ns]

推荐阅读