在不基于日期的列值之前根据日期选择行

时间:2019-12-18 11:13:15

标签: pandas

我通常对Pandas和这个领域都不熟悉,因此遇到一个挑战,即需要一个类似以下数据框的数据框,需要在“情绪”列中搜索一个名为“过敏”的值,然后从结果数据中选择包含“过敏”的行,以及基于日期的在此之前的行。因此,在此示例中,它包含了“过敏”之前最多2天的行。

我的数据框看起来像:-

id    food     date        mood
id 1  nuts     2018-11-12  high
id 2  potatoes 2018-11-13  low
id 3  fish     2018-11-14  high
id 4  bread    2018-11-14  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

我想要实现的是将提供类似以下内容的代码:-

id    food     date        mood
id 2  potatoes 2018-11-13  low
id 3  fish     2018-11-14  high
id 4  bread    2018-11-14  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

因此,当“情绪=过敏”时,返回前两天的“食物”条目。

我希望最终会导致这样一种结果,即普通食品被理解为“鱼”,并且该信息会反馈给用户,例如:-

"Did you realize that when you eat fish you get allergies" 

有人可以建议我使用熊猫的正确方法吗?

谢谢

micdoher

1 个答案:

答案 0 :(得分:0)

使用allergies进行比较,创建帮助器系列,更改Series.cumsum并使用累积总和,然后传递到GroupBy.cumcount,第二列和第三列通过isin进行比较:

s = df['mood'].eq('allergies').iloc[::-1].cumsum()
df = df[df.groupby(s).cumcount(ascending=False).isin([1,2])]
print (df)
     id      food        date  mood
1  id 2  potatoes  2018-11-13   low
2  id 3      fish  2018-11-14  high
4  id 5     bread  2018-11-16  high
5  id 6      fish  2018-11-17  high

详细信息

print (s)
6    1
5    1
4    1
3    2
2    2
1    2
0    2
Name: mood, dtype: int32

另一种解决方案:

s = df['mood'].eq('allergies').iloc[::-1].cumsum().sort_index()
df = df[(df.groupby(s).cumcount(ascending=False) < 3) & s.duplicated(keep='last')]
print (df)
     id      food        date  mood
1  id 2  potatoes  2018-11-13   low
2  id 3      fish  2018-11-14  high
4  id 5     bread  2018-11-16  high
5  id 6      fish  2018-11-17  high