Python 使用pandas:criteria最佳性能在数据帧中追加空行 要求:将空行添加到数据帧 约束:性能

Python 使用pandas:criteria最佳性能在数据帧中追加空行 要求:将空行添加到数据帧 约束:性能,python,pandas,Python,Pandas,这将起作用并向数据帧追加一个空行,但当使用%lprun-f进行检查时,loc分配操作占用了90%的时间 我必须在同一操作中执行更多3k时间(在其他类似3k数据帧上) 仅考虑性能,如何提高性能 由于您没有提供有关输入数据帧的任何详细信息,因此我根据我的假设进行回答。您可以尝试使用pandas.DataFrame.reindex(),如下所示: import pandas as pd if __name__ == '__main__': # dataframe is onedf

这将起作用并向数据帧追加一个空行,但当使用%lprun-f进行检查时,loc分配操作占用了90%的时间

  • 我必须在同一操作中执行更多3k时间(在其他类似3k数据帧上)

  • 仅考虑性能,如何提高性能


  • 由于您没有提供有关输入数据帧的任何详细信息,因此我根据我的假设进行回答。您可以尝试使用pandas.DataFrame.reindex(),如下所示:

    import pandas as pd
    if __name__ == '__main__':
        # dataframe is onedf
        onedf = pd.DataFrame(columns=["c0", "c1"])
        onedf = onedf.reindex(onedf.index.tolist() + list(range(0, 20)))
        print(onedf)
    
    结果:

         c0   c1
    0   NaN  NaN
    1   NaN  NaN
    2   NaN  NaN
    3   NaN  NaN
    4   NaN  NaN
    5   NaN  NaN
    6   NaN  NaN
    7   NaN  NaN
    8   NaN  NaN
    9   NaN  NaN
    10  NaN  NaN
    11  NaN  NaN
    12  NaN  NaN
    13  NaN  NaN
    14  NaN  NaN
    15  NaN  NaN
    16  NaN  NaN
    17  NaN  NaN
    18  NaN  NaN
    19  NaN  NaN
    

    由于您没有提供有关输入数据帧的任何详细信息,因此我将根据我的假设进行回答。您可以尝试使用pandas.DataFrame.reindex(),如下所示:

    import pandas as pd
    if __name__ == '__main__':
        # dataframe is onedf
        onedf = pd.DataFrame(columns=["c0", "c1"])
        onedf = onedf.reindex(onedf.index.tolist() + list(range(0, 20)))
        print(onedf)
    
    结果:

         c0   c1
    0   NaN  NaN
    1   NaN  NaN
    2   NaN  NaN
    3   NaN  NaN
    4   NaN  NaN
    5   NaN  NaN
    6   NaN  NaN
    7   NaN  NaN
    8   NaN  NaN
    9   NaN  NaN
    10  NaN  NaN
    11  NaN  NaN
    12  NaN  NaN
    13  NaN  NaN
    14  NaN  NaN
    15  NaN  NaN
    16  NaN  NaN
    17  NaN  NaN
    18  NaN  NaN
    19  NaN  NaN
    

    在熊猫中的附加操作成本很高。您可以做的是将dataframe转换为字典列表,然后将temp附加到字典的python列表中。 处理后,将字典列表转换回数据帧

    onedf_new = pd.DataFrame(dict1)
    
    例如,假设我有这样一个数据帧onedf-

    |   | product  | old_price | new_price | final_price |
    |---|----------|-----------|-----------|-------------|
    | 0 | product1 | 10        | 20.0      | 10.0        |
    | 1 | product2 | 20        | 10.0      | -10.0       |
    | 2 | product3 | 30        | NaN       | NaN         |
    | 3 | product4 | 40        | NaN       | NaN         |
    
    现在,您希望将行附加到该字典中,因此首先将其转换为字典列表-

    dict1 = onedf.to_dict(orient='records')
    
    这将产生这样的输出-

    [{'product': 'product1',
      'old_price': 10,
      'new_price': 20.0,
      'final_price': 10.0},
     {'product': 'product2',
      'old_price': 20,
      'new_price': 10.0,
      'final_price': -10.0},
     {'product': 'product3',
      'old_price': 30,
      'new_price': nan,
      'final_price': nan},
     {'product': 'product4',
      'old_price': 40,
      'new_price': nan,
      'final_price': nan}]
    
    现在,只需创建一个与相同格式匹配的空dict并追加。这样做会快得多

    
    import numpy as np
    temp_false_list = [np.nan for _ in range(4)]
    temp_dict = dict(zip(onedf.columns.values,temp_false_list))
    # {'product': nan, 'old_price': nan, 'new_price': nan, 'final_price': nan}
    
    将它附加到我们以前创建的dict中-

    dict1.append(temp_dict)
    
    最后,将dict1转换回数据帧

    onedf_new = pd.DataFrame(dict1)
    

    在熊猫中的附加操作成本很高。您可以做的是将dataframe转换为字典列表,然后将temp附加到字典的python列表中。 处理后,将字典列表转换回数据帧

    onedf_new = pd.DataFrame(dict1)
    
    例如,假设我有这样一个数据帧onedf-

    |   | product  | old_price | new_price | final_price |
    |---|----------|-----------|-----------|-------------|
    | 0 | product1 | 10        | 20.0      | 10.0        |
    | 1 | product2 | 20        | 10.0      | -10.0       |
    | 2 | product3 | 30        | NaN       | NaN         |
    | 3 | product4 | 40        | NaN       | NaN         |
    
    现在,您希望将行附加到该字典中,因此首先将其转换为字典列表-

    dict1 = onedf.to_dict(orient='records')
    
    这将产生这样的输出-

    [{'product': 'product1',
      'old_price': 10,
      'new_price': 20.0,
      'final_price': 10.0},
     {'product': 'product2',
      'old_price': 20,
      'new_price': 10.0,
      'final_price': -10.0},
     {'product': 'product3',
      'old_price': 30,
      'new_price': nan,
      'final_price': nan},
     {'product': 'product4',
      'old_price': 40,
      'new_price': nan,
      'final_price': nan}]
    
    现在,只需创建一个与相同格式匹配的空dict并追加。这样做会快得多

    
    import numpy as np
    temp_false_list = [np.nan for _ in range(4)]
    temp_dict = dict(zip(onedf.columns.values,temp_false_list))
    # {'product': nan, 'old_price': nan, 'new_price': nan, 'final_price': nan}
    
    将它附加到我们以前创建的dict中-

    dict1.append(temp_dict)
    
    最后,将dict1转换回数据帧

    onedf_new = pd.DataFrame(dict1)
    

    附加空行的条件是什么?如果是的话,为什么不创建一个包含一行数据的临时数据框,并仅连接到现有数据框?附加空行的标准是什么?如果是的话,为什么不创建一个包含一行数据的临时数据框,然后只连接到现有的数据框呢?为了更清楚,我已经修改了这个问题。请检查,为了更清楚,我已经修改了问题。请检查,不确定这是否适用于3k数据帧。我认为您正在为同一数据帧多次执行相同的过程:)不确定这是否适用于3k数据帧。我以为您在为同一数据帧多次执行相同的过程:)