关系数据集中索引的 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
假设我在 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