作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在解决一个具有包含家庭信息的数据框的问题。每个家庭都由一个或多个 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/
我是一名优秀的程序员,十分优秀!