在groupby之后,我研究了agg/apply/transform,但似乎没有一个能满足我的需要,下面是一个DF示例:
df_seq = pd.DataFrame({
'person':['Tom', 'Tom', 'Tom', 'Lucy', 'Lucy', 'Lucy'],
'day':[1,2,3,1,4,6],
'food':['beef', 'lamb', 'chicken', 'fish', 'pork', 'venison']
})
person,day,food
Tom,1,beef
Tom,2,lamb
Tom,3,chicken
Lucy,1,fish
Lucy,4,pork
Lucy,6,venison
day
列显示,对于每个person
,他/她按顺序消费食物。
现在我想按person
列分组,并创建一个包含两个相邻日期/时间的食物对的DataFrame(如下所示)。
请注意,day
列在此仅用于示例目的,因此不应使用其值。* 这仅意味着food
列是按顺序排列的。在我的真实的数据中,它是日期时间列。*
person,day,food,food_next
Tom,1,beef,lamb
Tom,2,lamb,chicken
Lucy,1,fish,pork
Lucy,4,pork,venison
目前,我只能使用for循环来遍历所有用户,速度非常慢。
是否可以使用groupby和apply/transform来实现此操作或任何矢量化操作?
2条答案
按热度按时间jvlzgdj91#
按
DataFrameGroupBy.shift
创建新列,然后按DataFrame.dropna
删除food_next
中缺少值的行:mccptt672#
这可能是一个稍微不完整的答案,并且它不执行标准意义上的聚合。
首先,一个小的查询函数,给定名称和日期,将返回第一个与参数匹配的结果(假设数据是预先排序的),如果失败,则返回某个默认值:
您可以按如下方式使用此选项:
现在,我们可以在一个
apply
语句中使用这个函数,用这个函数按行应用的结果填充一个新列:给予一下吧,我不相信你会看到巨大的性能改进,但它会很有趣的发现。