[PYTHON] Python - 데이터 프레임에 행을 추가하는 효율적인 방법
PYTHONPython - 데이터 프레임에 행을 추가하는 효율적인 방법
이 질문과 다른 것들은 매번 전체 데이터 프레임을 다시 복사하기 때문에 pandas 데이터 프레임을 빌드하는 데 concat 또는 append를 사용하는 것은 좋지 않은 것으로 보입니다.
내 프로젝트에는 30 초마다 소량의 데이터를 가져 오는 작업이 포함됩니다. 이것은 주말에 3 일간 실행될 수 있으므로 한 번에 한 행씩 8000 개가 넘는 행을 쉽게 만들 수 있습니다. 이 데이터 프레임에 행을 추가하는 가장 효율적인 방법은 무엇입니까?
해결법
-
==============================
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.이 답변의 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.문제를 두 부분으로 나누어야합니다.
문제를 두 부분으로 나누어야합니다.
데이터가 중요한 경우 (즉, 데이터를 잃을 여유가없는 경우) - 대기열로 보내면 대기열에서 일괄 적으로 읽을 수 있습니다.
대기열은 신뢰할 수있는 (보장 된) 인수를 제공하며 데이터가 손실되지 않도록합니다.
대기열에서 데이터를 읽고 데이터베이스에 덤프 할 수 있습니다.
이제 파이썬 응용 프로그램은 데이터베이스에서 읽은 다음 응용 프로그램에 적합한 간격으로 분석을 수행합니다. 아마도 시간당 평균을 수행하려고 할 것입니다. 이 경우 db에서 데이터를 가져 와서 다른 데이터베이스 / 테이블 / 파일에 결과를 기록하기 위해 매시간 스크립트를 실행해야합니다.
최종선 - 애플리케이션의 수집 및 분석 부분 분할.
from https://stackoverflow.com/questions/41888080/python-efficient-way-to-add-rows-to-dataframe by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] 업데이트를 수행 할 때 명시 적으로 커밋해야하는 이유는 무엇입니까? (0) | 2018.11.06 |
---|---|
[PYTHON] 파이썬에서 함수가 오버라이드되는 것을 막는 법 (0) | 2018.11.06 |
[PYTHON] datetime을 하루 만에 늘리는 방법은 무엇입니까? (0) | 2018.11.06 |
[PYTHON] PIL에서 사용하도록 POST에서 base64 디코딩 (0) | 2018.11.06 |
[PYTHON] pip 설치 PIL-E TICKETS-1 - JPEG / PNG 지원 안 함 (0) | 2018.11.06 |