DataFrame에 추가, 병합, 행과 열 이름 및 순서 [미래 실험실 pYTHON]

안녕하세요. 언제나 휴일에 언휴예요.

이번 강의에서는 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)