[PYTHON] for 루프에서 pandas 데이터 프레임에 행을 추가하는 방법은 무엇입니까?
PYTHONfor 루프에서 pandas 데이터 프레임에 행을 추가하는 방법은 무엇입니까?
나는 다음과 같은 반복문을 가지고있다.
for i in links:
data = urllib2.urlopen(str(i)).read()
data = json.loads(data)
data = pd.DataFrame(data.items())
data = data.transpose()
data.columns = data.iloc[0]
data = data.drop(data.index[[0]])
이렇게 생성 된 각 데이터 프레임에는 대부분의 열이 다른 열과 공통으로 있지만 전부는 아닙니다. 또한, 그들은 모두 하나의 행을가집니다. 필자가해야 할 일은 for 루프로 생성 된 각 데이터 프레임의 모든 개별 열과 각 행을 데이터 프레임에 추가하는 것입니다.
나는 팬더를 연결하려고했으나 비슷하게 동작했지만 아무 것도 작동하지 않는 것처럼 보였다. 어떤 생각? 감사.
해결법
-
==============================
1.데이터가 다음과 같다고 가정 해보십시오.
데이터가 다음과 같다고 가정 해보십시오.
import pandas as pd import numpy as np np.random.seed(2015) df = pd.DataFrame([]) for i in range(5): data = dict(zip(np.random.choice(10, replace=False, size=5), np.random.randint(10, size=5))) data = pd.DataFrame(data.items()) data = data.transpose() data.columns = data.iloc[0] data = data.drop(data.index[[0]]) df = df.append(data) print('{}\n'.format(df)) # 0 0 1 2 3 4 5 6 7 8 9 # 1 6 NaN NaN 8 5 NaN NaN 7 0 NaN # 1 NaN 9 6 NaN 2 NaN 1 NaN NaN 2 # 1 NaN 2 2 1 2 NaN 1 NaN NaN NaN # 1 6 NaN 6 NaN 4 4 0 NaN NaN NaN # 1 NaN 9 NaN 9 NaN 7 1 9 NaN NaN
그런 다음
np.random.seed(2015) data = [] for i in range(5): data.append(dict(zip(np.random.choice(10, replace=False, size=5), np.random.randint(10, size=5)))) df = pd.DataFrame(data) print(df)
즉, 각 행에 대해 새 DataFrame을 형성하지 마십시오. 대신, dicts 목록에있는 모든 데이터를 수집 한 다음 루프 바깥 쪽 끝에서 df = pd.DataFrame (data)을 한 번 호출하십시오.
df.append를 호출 할 때마다 하나의 여분의 행이있는 새 DataFrame을위한 공간을 할당하고 원래 DataFrame의 모든 데이터를 새 DataFrame에 복사 한 다음 데이터를 새 행에 복사해야합니다. 모든 할당과 복사는 매우 비효율적 인 루프에서 df.append를 호출하게 만듭니다. 복사의 시간 비용은 행 수와 함께 2 차적으로 커집니다. 한 번 호출 된 DataFrame은 코드를 작성하기가 쉬울뿐만 아니라 성능이 훨씬 향상됩니다. 복사 시간 비용은 행 수에 따라 선형 적으로 증가합니다.
-
==============================
2.루프에 행을 추가 할 수있는 이유는 두 가지입니다. 1. 기존 df에 추가하고, 2. 새 df를 만듭니다.
루프에 행을 추가 할 수있는 이유는 두 가지입니다. 1. 기존 df에 추가하고, 2. 새 df를 만듭니다.
새 df를 만들려면 목록으로 데이터를 만든 다음 데이터 프레임을 만들어야한다고 잘 문서화되어 있다고 생각합니다.
cols = ['c1', 'c2', 'c3'] lst = [] for a in range(2): lst.append([1, 2, 3]) df1 = pd.DataFrame(lst, columns=cols) df1 Out[3]: c1 c2 c3 0 1 2 3 1 1 2 3
또는 인덱스가있는 데이터 프레임을 만든 다음 추가합니다.
cols = ['c1', 'c2', 'c3'] df2 = pd.DataFrame(columns=cols, index=range(2)) for a in range(2): df2.loc[a].c1 = 4 df2.loc[a].c2 = 5 df2.loc[a].c3 = 6 df2 Out[4]: c1 c2 c3 0 4 5 6 1 4 5 6
기존 데이터 프레임에 추가하려는 경우 위의 두 가지 방법 중 하나를 사용하여 df를 함께 추가 할 수 있습니다 (색인 포함 또는 제외).
df3 = df2.append(df1, ignore_index=True) df3 Out[6]: c1 c2 c3 0 4 5 6 1 4 5 6 2 1 2 3 3 1 2 3
또는 사전 항목 목록을 작성하고 위의 대답과 같이 추가 할 수도 있습니다.
lst_dict = [] for a in range(2): lst_dict.append({'c1':2, 'c2':2, 'c3': 3}) df4 = df1.append(lst_dict) df4 Out[7]: c1 c2 c3 0 1 2 3 1 1 2 3 0 2 2 3 1 2 2 3
dict (zip (cols, vals)) 사용)
lst_dict = [] for a in range(2): vals = [7, 8, 9] lst_dict.append(dict(zip(cols, vals))) df5 = df1.append(lst_dict)
-
==============================
3.임시 빈 데이터 프레임의 도움으로 for 루프에서 데이터 프레임을 만들었습니다. for 루프를 반복 할 때마다 새 데이터 프레임이 만들어져 이전 반복의 내용을 덮어 쓰게되므로
임시 빈 데이터 프레임의 도움으로 for 루프에서 데이터 프레임을 만들었습니다. for 루프를 반복 할 때마다 새 데이터 프레임이 만들어져 이전 반복의 내용을 덮어 쓰게되므로
따라서 이미 만들어진 빈 데이터 프레임으로 데이터 프레임의 내용을 이동해야합니다. 그것만큼이나 간단합니다. 우리는 아래와 같이 .append 함수를 사용할 필요가 있습니다.
temp_df = pd.DataFrame() #Temporary empty dataframe for sent in Sentences: New_df = pd.DataFrame({'words': sent.words}) #Creates a new dataframe and contains tokenized words of input sentences temp_df = temp_df.append(New_df, ignore_index=True) #Moving the contents of newly created dataframe to the temporary dataframe
for 루프 외부에서 임시 데이터 프레임의 내용을 마스터 데이터 프레임으로 복사 한 다음 필요하지 않으면 임시 데이터 프레임을 삭제할 수 있습니다
from https://stackoverflow.com/questions/31674557/how-to-append-rows-in-a-pandas-dataframe-in-a-for-loop by cc-by-sa and MIT license
'PYTHON' 카테고리의 다른 글
[PYTHON] Alexa 용 AWS 람다 함수에 파이썬 라이브러리를 추가하려면 어떻게합니까? (0) | 2018.10.26 |
---|---|
[PYTHON] 파이썬에서 함수에서 전역 변수를 정의 할 수 있습니까? [닫힘] (0) | 2018.10.26 |
[PYTHON] 주어진 wget 명령과 동일한 Python (0) | 2018.10.26 |
[PYTHON] Pandas Groupby Agg 기능이 저하되지 않음 (0) | 2018.10.26 |
[PYTHON] Python 2.4로 파일의 압축을 해제하는 방법은 무엇입니까? (0) | 2018.10.26 |