关系数据集中索引的 id 列表的每个元素的最后一个成员

Last member of each element of an id list of indices in relational dataset

假设我在 python 中有两个数据集:家庭和人(个人)。密钥或 ID (int64) 将家庭与一个或多个人联系起来。我想创建一个名为“last_member”的二进制变量,如果同一家庭中有更多人,则取值为 0,如果此人是家庭的最后一个成员,则取值为 1。

一个简单的例子如下:

last_member id ...
0           1  ...
0           1  ...
1           1  ...
1           2  ...
0           3  ...
1           3  ...
...

我可以从家庭数据集或个人数据集本身获取唯一 ID 的数量。

我感觉 numpy's where function, or pandas' aggregate 都是找到这种解决方案的有力候选者。尽管如此,我仍然无法理解 高效 解决方案,它不涉及,比方说,遍历索引列表。

我编写了一个可以高效运行并解决问题的函数。这个想法是创建充满零的变量“last_member”。这个变量让我们可以使用 pandas' groupby 来计算每个 id 的成员数量。然后我们计算累积和(减去 1,因为 python 的索引)以找到我们想要将“last_member”变量的值更改为 1 的索引。

def create_last_member_variable(data):
    """ Creates a last_member variable based on the index of id variable.
    """
    data["last_member"] = 0
    n_members = data.groupby(["id"]).count()["last_member"]
    row_idx = np.cumsum(n_members) - 1 
    data.loc[row_idx, "last_member"] = 1

    return data