首页 > 解决方案 > 内部的 Pandas DataFrame 调用在当前行上应用相同的 DataFrame 条件,性能如何?

问题描述

我有超过 50 000 行的 DFV,每行由大约 15 列组成。

我想为每一行应用函数使用:

def (val,date,rang,periode):
    if periode <=10:
        if rang == 0:
            DATE = date
            return DFV[(DFV.DATE==DATE)&(DFV.VAL==val)&(DFV.PERIODE.isin(range(1,11)))].shape[0]
        else :
            DATE = dateavant2(date,rang-1)
            return DFV[(DFV.DATE==DATE)&(DFV.VAL==val)&(DFV.PERIODE.isin(range(1,11)))].shape[0]
    

然后通过以下方式在同一 DFV 数据框中创建新列:

DFV["HOMAPP"]  = DFV[["VAL","DATE","PERIODE"]]\
.apply(lambda l : Howmanyapp(l["VAL"],l["DATE"],0,l["PERIODE"]),axis=1)

坏与否?

如何提高类似功能的处理速度?(偶数循环)

提前致谢。

标签: pythonpandas

解决方案


  1. 我不明白你的代码是如何工作的,Howmanyapp在定义中只能得到 3 个参数,在这里:.apply(lambda l : Howmanyapp(l["VAL"],l["DATE"],0,l["PERIODE"]),axis=1)你发送 4,它应该在这里停止工作。
  2. 为什么要使用 if 案例?您可以尝试使用 groupby + transform-count 吗?喜欢
DFV['periode_range'] = pd.cut(DFV['PERIODE'], bins=[0,10, 16, np.inf], right=True, labels=['small', 'large', 'last'])
new_df = DFV.groupby(["VAL","DATE", 'periode_range']).count()
# here we need to merge 
DFV['periode_range'] = pd.cut(DFV['PERIODE'], bins=[0,10, np.inf], right=True, labels=['small', 'large'])
DFV = DFV.merge(new_df , on=["VAL","DATE", 'periode_range'])

上面的代码可能不起作用,因为我没有测试过。您可以尝试修改它,或者您可以将一些测试数据附加到您的问题中,以便我自己测试它。

  1. 另外我在互联网上没有找到参考dateavant2,所以我不知道如何处理它,如果你能帮助我,我将使用该功能调整代码。

推荐阅读