【发布时间】:2019-12-10 10:05:26
【问题描述】:
我有一个排序后的数据框(按“customer_id”和“point_in_time”排序),如下所示:
import pandas as pd
import numpy as np
testing = pd.DataFrame({"customer_id": (1,1,1,2,2,2,2,2,3,3,3,3,4,4),
"point_in_time": (4,5,6,1,2,3,7,9,5,6,8,10,2,5),
"x": ("d", "a", "c", "ba", "cd", "d", "o", "a", "g", "f", "h", "d", "df", "b"),
"revenue": (np.nan, np.nan, 40, np.nan, np.nan, 23, np.nan, 10, np.nan, np.nan, np.nan, 40, np.nan, 100)})
testing
现在我想按“customer_id”和“revenue”对数据框进行分组。但是关于“收入”,一个组应该在最后一个现有收入之后开始,并以下一个出现的收入结束。 所以这些组应该是这样的:
如果我有这些小组,我可以轻松地做一个
testing.groupby(["customer_id", "groups"])
我首先尝试通过首先按“customer_id”分组并对其应用一个函数来填充“revenue”的缺失值来创建这些组:
def my_func(sub_df):
sub_df["groups"] = sub_df["revenue"].fillna(method="bfill")
sub_df.groupby("groups").apply(next_function)
testing.groupby(["customer_id"]).apply(my_func)
不幸的是,如果一个客户有两个完全相同的收入,这将不起作用。在这种情况下,使用 fillna 后,该客户的组列将仅包含一个不允许额外分组的值。
那么如何做到这一点以及完成这项任务的最有效方法是什么? 提前谢谢!
【问题讨论】:
标签: python-3.x pandas group-by