我通常对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
答案 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