복붙노트

[PYTHON] for 루프에서 pandas 데이터 프레임에 행을 추가하는 방법은 무엇입니까?

PYTHON

for 루프에서 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. ==============================

    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. ==============================

    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. ==============================

    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 루프 외부에서 임시 데이터 프레임의 내용을 마스터 데이터 프레임으로 복사 한 다음 필요하지 않으면 임시 데이터 프레임을 삭제할 수 있습니다

  4. 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