【问题标题】:pandas groupby apply is taking foreverpandas groupby apply 将永远存在
【发布时间】:2021-01-14 12:32:50
【问题描述】:

我正在尝试通过 5 个不同的采访(变量 V1016)识别大型数据框中的个人,并将其存储在变量 KeyInd 中。 KeyDomnascimento 具有相同值的行属于同一个人。

这是数据框的示例:

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


【解决方案1】:

我用不同的方法解决了这个问题。在第一次采访中,我用 ID 创建了另一个数据框,而不是使用 merge 和主数据框。工作得很好。

【讨论】:

    猜你喜欢
    • 2015-05-17
    • 2021-10-15
    • 2018-04-17
    • 2018-01-04
    • 2017-06-20
    • 2019-09-08
    • 2021-08-12
    • 1970-01-01
    • 2017-09-14
    相关资源
    最近更新 更多