복붙노트

[PYTHON] Python - 데이터 프레임에 행을 추가하는 효율적인 방법

PYTHON

Python - 데이터 프레임에 행을 추가하는 효율적인 방법

이 질문과 다른 것들은 매번 전체 데이터 프레임을 다시 복사하기 때문에 pandas 데이터 프레임을 빌드하는 데 concat 또는 append를 사용하는 것은 좋지 않은 것으로 보입니다.

내 프로젝트에는 30 초마다 소량의 데이터를 가져 오는 작업이 포함됩니다. 이것은 주말에 3 일간 실행될 수 있으므로 한 번에 한 행씩 8000 개가 넘는 행을 쉽게 만들 수 있습니다. 이 데이터 프레임에 행을 추가하는 가장 효율적인 방법은 무엇입니까?

해결법

  1. ==============================

    1.존재하지 않는 인덱스의 loc을 사용하여 DataFrame에 행을 추가 할 수 있습니다. 팬더 문서에서 :

    존재하지 않는 인덱스의 loc을 사용하여 DataFrame에 행을 추가 할 수 있습니다. 팬더 문서에서 :

    In [119]: dfi
    Out[119]: 
       A  B  C
    0  0  1  0
    1  2  3  2
    2  4  5  4
    
    In [120]: dfi.loc[3] = 5
    
    In [121]: dfi
    Out[121]: 
       A  B  C
    0  0  1  0
    1  2  3  2
    2  4  5  4
    3  5  5  5
    

    예상대로, loc 사용은 append (약 14x)보다 훨씬 빠릅니다.

    import pandas as pd
    df = pd.DataFrame({"A": [1,2,3], "B": [1,2,3], "C": [1,2,3]})
    
    %%timeit
    df2 = pd.DataFrame({"A": [4], "B": [4], "C": [4]})
    df.append(df2)
    
    # 1000 loops, best of 3: 1.61 ms per loop
    
    %%timeit
    df.loc[3] = 4
    
    # 10000 loops, best of 3: 113 µs per loop
    
  2. ==============================

    2.이 답변의 df.loc [i] = [new_data] 제안을 사용했지만 행 수가 50 만을 넘었고 그 속도가 매우 느립니다.

    이 답변의 df.loc [i] = [new_data] 제안을 사용했지만 행 수가 50 만을 넘었고 그 속도가 매우 느립니다.

    주어진 답변이 OP의 질문에 좋지만, CSV 객체를 메모리에 추가하기 위해 csvwriter를 사용하기 위해서는 (OP에서 설명한 트릭을 사용하는 대신) 많은 수의 행을 처리 할 때 더 효율적이라는 것을 알았습니다. 마지막으로 pandas.read_csv (csv)를 사용하여 원하는 DataFrame 출력을 생성하십시오.

    from io import BytesIO
    from csv import writer 
    import pandas as pd
    
    output = BytesIO()
    csv_writer = writer(output)
    
    for row in iterable_object:
        csv_writer.writerow(row)
    
    output.seek(0) # we need to get back to the start of the BytesIO
    df = pd.read_csv(output)
    return df
    

    이것은 500,000 행에 대해 1000 배 빨라졌으며 행 수가 증가함에 따라 속도 향상은 더 커질 것입니다 (df.loc [1] = [data]는 비교적 느려질 것입니다)

    OP보다 많은 행을 처리 할 때 효율성이 필요한 사람에게 도움이되기를 바랍니다.

  3. ==============================

    3.문제를 두 부분으로 나누어야합니다.

    문제를 두 부분으로 나누어야합니다.

    데이터가 중요한 경우 (즉, 데이터를 잃을 여유가없는 경우) - 대기열로 보내면 대기열에서 일괄 적으로 읽을 수 있습니다.

    대기열은 신뢰할 수있는 (보장 된) 인수를 제공하며 데이터가 손실되지 않도록합니다.

    대기열에서 데이터를 읽고 데이터베이스에 덤프 할 수 있습니다.

    이제 파이썬 응용 프로그램은 데이터베이스에서 읽은 다음 응용 프로그램에 적합한 간격으로 분석을 수행합니다. 아마도 시간당 평균을 수행하려고 할 것입니다. 이 경우 db에서 데이터를 가져 와서 다른 데이터베이스 / 테이블 / 파일에 결과를 기록하기 위해 매시간 스크립트를 실행해야합니다.

    최종선 - 애플리케이션의 수집 및 분석 부분 분할.

  4. from https://stackoverflow.com/questions/41888080/python-efficient-way-to-add-rows-to-dataframe by cc-by-sa and MIT license