gpt4 book ai didi

python - 存在行间依赖时添加列的最快方法?

转载 作者:行者123 更新时间:2023-12-01 07:15:06 25 4
gpt4 key购买 nike

我正在解决一个具有包含家庭信息的数据框的问题。每个家庭都由一个或多个 parent 和 child 组成。每个人都有一个唯一的UserID,每个家庭都有一个唯一的FamilyID。一个人只能属于一个家庭。 “类型”列指示该人是 parent 还是 child ,“年龄”指示用户的年龄。

我想为 child 添加一个名为 ParentAge 的列,用于指示最大 parent 的年龄。

import pandas as pd
import numpy as np

#example data
df = pd.DataFrame([[1, 22, 'Child', 8],
[1, 62, 'Parent', 36],
[2, 102, 'Child', 6],
[2, 103, 'Child', 10],
[2, 107, 'Parent', 40],
[2, 108, 'Parent', 42]],
columns=['FamilyId', 'UserId', 'Type', 'Age'])

expected_result = pd.DataFrame([[1, 22, 'Child', 8, 36],
[2, 102, 'Child', 6, 42],
[2, 103, 'Child', 10, 42]],
columns=['FamilyId', 'UserId', 'Type', 'Age', 'ParentAge'])

这是我到目前为止所尝试过的(我尝试了一些其他方法,但性能大致相似)

parents = df.query('Type=="Parent"')
children = df.query('Type=="Child"')

oldest_parents = parents.groupby('FamilyId') \
.apply(pd.DataFrame.nlargest, n=1, columns='Age') \
.reset_index(drop=True) \
.rename(columns={'Age': 'ParentAge'})

pd.merge(children, oldest_parents[['FamilyId', 'ParentAge']], on='FamilyId')

上述方法可行,但对于接近一百万行的数据帧,需要 20 多个小时才能完成。所有其他技术都在同一范围内。我花了几秒钟在 R 中使用 dplyr 库来完成此操作。我想知道是否有更快的方法来完成此任务?

最佳答案

选项 1:尝试使用 groupby().max() 而不是 apply:

df[df['Type'].eq('Child')].merge(df[df['Type'].eq('Parent')].groupby('FamilyId').Age.max(),
on='FamilyId',
suffixes=('','Parent'))

选项 2:最快,假设最年长的 parent 也是家庭中最年长的:

df['Parent_Age'] = df.groupby('FamilyId').Age.transform('max')
df[df['Type'].eq('Child')]

选项 3:更快,无需假设 parent 年龄最大(例如,资助 parent ):

df['Parent_Age'] = (df['Age'].mul(df['Type'].eq('Parent'))
.groupby(df['FamilyId']).transform('max')
)
df[df['Type'].eq('Child')]

输出:

   FamilyId  UserId   Type  Age  AgeParent
0 1 22 Child 8 36
1 2 102 Child 6 42
2 2 103 Child 10 42

关于python - 存在行间依赖时添加列的最快方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58015305/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com