안녕하세요. 언제나 휴일에 언휴예요.
이번 강의에서는 DataFrame에 행 추가 및 병합 등 다양한 실습을 해 볼게요.
빈 DataFrame 생성 및 행 추가 열 길이 같은 DataFrame 행 병합 행 길이 같은 DataFrame 열 병합 행 이름, 열 이름 설정 특정 행, 특정 열 이름 바꾸기 빈 값으로 데이터 넣기 행 순서 바꾸기, 열 순서 바꾸기 전체 소스 코드
빈 DataFrame 생성 및 행 추가
빈 DataFrame을 생성할 때 행과 열 모두 빈 상태라면 아무 의미가 없습니다.
열 정보는 갖고 있어야 행 데이터를 추가할 수 있어요.
다음은 행과 열 모두 빈 상태인 DataFrame을 생성한 후에 행을 추가하는 코드입니다.
물론 정상적으로 동작하지 않아요.
import pandas as pd df = pd.DataFrame() df.loc[0]=[1,2,3,4,5] print(df)
실행하였을 때 오류 메시지입니다.
Traceback (most recent call last): File "D:/ehpub/dummy/DF추가삭제.py", line 3, in df.loc[0]=[1,2,3,4,5] File "C:\pandas\core\indexing.py", line 671, in __setitem__ self._setitem_with_indexer(indexer, value) File "C:\pandas\core\indexing.py", line 875, in _setitem_with_indexer return self._setitem_with_indexer_missing(indexer, value) File "C:\pandas\core\indexing.py", line 1107, in _setitem_with_indexer_missing raise ValueError("cannot set a frame with no defined columns") ValueError: cannot set a frame with no defined columns
앞으로 빈 DataFrame을 생성하는 것은 데이터가 빈 상태를 얘기할게요.
DataFrame의 구조(columns)는 약속해야겠죠.
DataFrame을 생성할 때 데이터와 행 이름, 열 이름 등을 전달할 수가 있죠.
이 중에 열 이름만 전달하면 데이터는 비어있고 구조만 약속한 DataFrame을 만들 수 있어요.
import pandas as pd #빈 DataFrame 생성 df1 = pd.DataFrame(columns=range(5)) print(df1)
다음은 실행 모습입니다.
Empty DataFrame Columns: [0, 1, 2, 3, 4] Index: []
행을 추가할 때 멤버 loc를 이용합니다.
df.loc[행이름]= 행 데이터
df1.loc[0]=[1,2,3,4,5] print(df1)
실행 결과는 다음과 같습니다.
0 1 2 3 4 0 1 2 3 4 5
열 길이 같은 DataFrame 행 병합
열 길이나 행 길이가 같은 DataFrame은 하나로 병합할 수 있어요.
열 길이가 같을 때 append 함수로 하나의 DataFrame으로 병합할 수 있습니다.
주의할 점은 병합한 DataFrame을 반환하므로 필요한 변수에 설정하여 사용하세요.
new_df = df1.append(df2)
다음은 df1와 열 길이가 같은 df2를 생성하여 하나로 병합하는 예제입니다.
#열 길이 같은 DataFrame 행 병합 df2 = pd.DataFrame(columns=range(5)) df2.loc[0]=[11,12,13,14,15] print(df2) df1 = df1.append(df2) print(df1)
실행 결과는 다음과 같습니다.
0 1 2 3 4 0 11 12 13 14 15 0 1 2 3 4 0 1 2 3 4 5 0 11 12 13 14 15
행 길이 같은 DataFrame 열 병합
행 길이가 같은 DataFrame은 join 함수로 병합할 수 있어요.
마찬가지로 병합한 DataFrame을 반환하므로 필요한 변수에 설정하여 사용하세요.
new_df = df1.join(df2)
다음은 행 길이가 같은 df3를 생성하여 df1과 df3를 병합하는 예제 코드입니다.
#행 길이 같은 DataFrame 열 병합 df3 = pd.DataFrame([[3],[4]],columns=range(5,6)) print(df3) df1 = df1.join((df3)) print(df1)
실행 결과는 다음과 같습니다.
5 0 3 1 4 0 1 2 3 4 5 0 1 2 3 4 5 3 0 11 12 13 14 15 3
행 이름, 열 이름 설정
행 이름 과 열 이름은 index와 columns 멤버에 설정합니다.
#행 이름 설정 df1.index = range(1,3) print(df1) #열 이름 설정 df1.columns =range(1,7) print(df1)
실행 결과는 다음과 같습니다.
0 1 2 3 4 5 1 1 2 3 4 5 3 2 11 12 13 14 15 3 1 2 3 4 5 6 1 1 2 3 4 5 3 2 11 12 13 14 15 3
특정 행 이름, 열 이름 바꾸기
특정 행 이름과 열 이름을 바꿀 때는 rename 함수를 사용합니다.
이 때 inplace=True를 지정하는 것을 잊지 마세요.
df1.rename(index={old행이름: new행이름},columns={old열이름: new열이름},inplace=True)
#특정 행 이름 바꾸기 df1.rename(index={2:4},inplace=True) print(df1) #특정 열 이름 바꾸기 df1.rename(columns={6:7},inplace=True) print(df1)
실행 결과는 다음과 같습니다.
1 2 3 4 5 6 1 1 2 3 4 5 3 4 11 12 13 14 15 3 1 2 3 4 5 7 1 1 2 3 4 5 3 4 11 12 13 14 15 3
빈 값으로 데이터 넣기
데이터를 집어넣을 때 아직 측정하지 못하거나 준비를 못한 부분이 있을 수 있습니다.
이러한 데이터를 결측치라고 부르는데 이를 포함하여 데이터를 넣어야 구조가 안정적입니다.
이 때 numpy의 nan을 사용하세요.
DataFrame의 특정 행 값을 빈 값으로 넣을 때는 loc를 이용하고 특정 컬럼 값일 때는 바로 인덱스를 사용하세요.
df[열이름]=numpy.nan
df.loc[행이름]=numpy.nan
다음은 2번 행을 추가한 후에 6번 컬럼 값과 3번 행 값을 빈 값으로 집어넣는 예제 코드입니다.
#빈 값으로 데이터 넣기 df1.loc[2]=[3,5,6,7,9,2] import numpy as np df1[6] = np.nan df1.loc[3]=np.nan print(df1)
실행 결과는 다음과 같습니다.
1 2 3 4 5 7 6 1 1 2 3 4 5 3.0 NaN 4 11 12 13 14 15 3.0 NaN 2 3 5 6 7 9 2.0 NaN 3 NaN NaN NaN NaN NaN NaN NaN
행 순서 바꾸기, 열 순서 바꾸기
행 순서를 바꿀 때는 reindex 함수를 이용합니다.
열 순서를 바꿀 때는 []를 이용합니다.
df = df.reindex(index=행데이터)
df = df[열데이터]
#행 순서 바꾸기 df1 = df1.reindex(index=[1,2,3,4]) #열 순서 바꾸기 df1=df1[list(range(1,8))]#df1[[1,2,3,4,5,6,7]] print(df1)
다음은 실행 결과입니다.
1 2 3 4 5 6 7 1 1 2 3 4 5 NaN 3.0 2 3 5 6 7 9 NaN 2.0 3 NaN NaN NaN NaN NaN NaN NaN 4 11 12 13 14 15 NaN 3.0
전체 소스 코드
다음은 이번 실습에서 사용한 전체 소스 코드입니다.
import pandas as pd #빈 DataFrame 생성 df1 = pd.DataFrame(columns=range(5)) print(df1) #행 추가 df1.loc[0]=[1,2,3,4,5] print(df1) #열 길이 같은 DataFrame 행 병합 df2 = pd.DataFrame(columns=range(5)) df2.loc[0]=[11,12,13,14,15] print(df2) df1 = df1.append(df2) print(df1) #행 길이 같은 DataFrame 열 병합 df3 = pd.DataFrame([[3],[4]],columns=range(5,6)) print(df3) df1 = df1.join((df3)) print(df1) #행 이름 설정 df1.index = range(1,3) print(df1) #열 이름 설정 df1.columns =range(1,7) print(df1) #특정 행 이름 바꾸기 df1.rename(index={2:4},inplace=True) print(df1) #특정 열 이름 바꾸기 df1.rename(columns={6:7},inplace=True) print(df1) #빈 값으로 데이터 넣기 df1.loc[2]=[3,5,6,7,9,2] import numpy as np df1[6] = np.nan df1.loc[3]=np.nan print(df1) #행 순서 바꾸기 df1 = df1.reindex(index=[1,2,3,4]) #열 순서 바꾸기 df1=df1[list(range(1,8))]#df1[[1,2,3,4,5,6,7]] print(df1)