【发布时间】:2021-01-14 12:32:50
【问题描述】:
我正在尝试通过 5 个不同的采访(变量 V1016)识别大型数据框中的个人,并将其存储在变量 KeyInd 中。 KeyDom 和 nascimento 具有相同值的行属于同一个人。
这是数据框的示例:
| V1016 | V2009 | V2007 | keyDom | keyInd | nascimento |
|---|---|---|---|---|---|
| 1 | 64 | 1 | 11000003417 | 0 | 1 - 7/11/1953 |
| 1 | 37 | 2 | 11000003417 | 0 | 2 - 22/12/1980 |
| 1 | 14 | 2 | 11000003417 | 0 | 2 - 1/11/2003 |
| 2 | 64 | 1 | 11000003417 | 0 | 1 - 7/11/1953 |
| 2 | 37 | 2 | 11000003417 | 0 | 2 - 22/12/1980 |
| 2 | 14 | 2 | 11000003417 | 0 | 2 - 1/11/2003 |
| 3 | 65 | 1 | 11000003417 | 0 | 1 - 7/11/1953 |
| 3 | 37 | 2 | 11000003417 | 0 | 2 - 22/12/1980 |
| 3 | 15 | 2 | 11000003417 | 0 | 2 - 1/11/2003 |
我正在尝试使用 groupby.apply 传递此函数:
def identifica_pessoas(df):
pessoas = df[df['V1016'] == 1]['nascimento'].tolist()
rodadas = list(range(1, 6))
for rodada in rodadas:
row = df[df.V1016 == rodada]
for i in range(len(pessoas)):
try:
indice = [index for index, value in enumerate(pessoas) if value == row.nascimento.iloc[i]][0]
row.keyInd.iloc[i] = row.keyDom.iloc[i] + str(indice)
except:
pass
df[df.V1016 == rodada] = row
return df
传递函数的代码如下:
painel7_filtrado = painel7.groupby('keyDom').apply(identifica_pessoas)
我期待的结果是这样的:
| V1016 | V2009 | V2007 | keyDom | keyInd | nascimento |
|---|---|---|---|---|---|
| 1 | 64 | 1 | 11000003417 | 110000034170 | 1 - 7/11/1953 |
| 1 | 37 | 2 | 11000003417 | 110000034171 | 2 - 22/12/1980 |
| 1 | 14 | 2 | 11000003417 | 110000034172 | 2 - 1/11/2003 |
| 2 | 64 | 1 | 11000003417 | 110000034170 | 1 - 7/11/1953 |
| 2 | 37 | 2 | 11000003417 | 110000034171 | 2 - 22/12/1980 |
| 2 | 14 | 2 | 11000003417 | 110000034172 | 2 - 1/11/2003 |
| 3 | 65 | 1 | 11000003417 | 110000034170 | 1 - 7/11/1953 |
| 3 | 37 | 2 | 11000003417 | 110000034171 | 2 - 22/12/1980 |
| 3 | 15 | 2 | 11000003417 | 110000034172 | 2 - 1/11/2003 |
但是处理需要几个小时。如何让这段代码更快?
【问题讨论】:
-
您能提供一个带有预期输出的示例数据框吗?在 lambda 中,您对方法中的整个数据帧进行了许多操作,这些操作针对每一行发生。例如:
pessoas = df[df['V1016'] == 1]['nascimento'].tolist()所以我建议在此之前执行此步骤并将预先计算的列表传递给 lambda。 -
我刚刚添加了一个示例数据框,谢谢。而且我还在根据您的提示计算 lambda 函数之外的列表。
-
Ian 的评论让我用不同的方法解决了这个问题。在第一次采访中,我与所有人一起制作了一个数据框,而不是使用
merge和主数据框。工作得很好。
标签: python pandas performance apply