다음과 같이 index=[] 로 특정 인덱스를 리스트 형태로 전달해 생성할 수 있다. 만약 다수의 데이터를 가져오고 싶은 경우에는 다음과 같이 불러올 수 있다.
>>> sr[[1,3]]연도 2020직장여부 Truedtype:object
DataFrame
DataFrame은 2차원 배열 구조로, R의 Dataframe에서 유래됐다. Dataframe의 각 열은 각각의 Series 객체이다. Series를 열벡터(vector)라고 하면, DataFrame은 여러개의 열벡터들이 같은 행 인덱스를 기준으로 줄지어 결합된 2차원 벡터 혹은 행렬(matrix)이다.
DataFrame의 열은 공통의 속성을 갖는 일련의 데이터를 나타내교, 행은 개별 관측대상에 대한 다양한 속성 데이터들의 모음인 레코드(record)가 된다.
>>> df.loc['상혁']수학 90영어 98사회 70과학 100Name: 상혁, dtype: int64>>> df.iloc[0]수학 90영어 98사회 70과학 100Name: 상혁, dtype: int64>>> df.loc[['상혁','우찬']] 수학 영어 사회 과학상혁 909870100우찬 70958090>>> df.iloc[0:1] 수학 영어 사회 과학상혁 909870100
범위지정으로 데이터를 가져오는 경우 슬라이싱 간격을 지정해서 가져올 수 있다.
>>> df.iloc[::2] 수학 영어 사회 과학상혁 909870100우찬 70958090
역순으로 인덱싱 하려면 [::-1] 을 하면된다.
>>> df.iloc[::-1] 수학 영어 사회 과학우찬 70958090상호 80898590상혁 909870100
열 선택
df["열 이름"]df.열이름
단일 열을 가져올 때는 다음과 같이 가져올 수 있다. 두 번째 방법(.)은 열 이름이 문자열인 경우에만 가능하다. 단일 열을 가져오는 경우 Series 객체를 반환한다.
df[[열1,열2, ..., 열n]]
[[]] 를 사용해 열을 여러개 선택할 수 있다. [[]] 로 여러개의 열을 가져오는 경우 DataFrame 객체를 반환하며, [[열1]] 로 가져오는 경우에도 DataFrame 객체를 반환한다.
>>> df['국어']= [100,80,90,70,80]>>>print(df) 수학 영어 사회 과학 국어상혁 1009870100100상호 8089859080우찬 7095809090진성 9393808670창동 70809010080
행추가
df.loc['새로운 행 이름']= 데이터 값 or 배열
하나의 데이터 값을 입력하게 되면 행의 모든 원소에 동일한 값이 추가되며, 후자의 경우 배열의 순서대로 열 위치에 값이 하나씩 추가된다.
>>> df.loc['진성']=0>>>print(df) 수학 영어 사회 과학상혁 909870100상호 80898590우찬 70958090진성 0000>>> df.loc['창동']= [70,80,90,100]>>>print(df) 수학 영어 사회 과학상혁 909870100상호 80898590우찬 70958090진성 0000창동 708090100
원소 값 변경
>>> df.iloc[0][0]=100>>>print(df) 수학 영어 사회 과학상혁 1009870100상호 80898590우찬 70958090진성 0000창동 708090100>>> df.loc['진성',['수학','영어']]=93>>>print(df) 수학 영어 사회 과학상혁 1009870100상호 80898590우찬 70958090진성 939300창동 708090100>>> df.loc['진성',['사회','과학']]=80,86>>>print(df) 수학 영어 사회 과학상혁 1009870100상호 80898590우찬 70958090진성 93938086창동 708090100
행 열 위치 변경
df.transpose()df.T
>>>print(df) 수학 영어 사회 과학 국어상혁 1009870100100상호 8089859080우찬 7095809090진성 9393808670창동 70809010080>>>print(df.T) 상혁 상호 우찬 진성 창동수학 10080709370영어 9889959380사회 7085808090과학 100909086100국어 10080907080
Index
특정 열을 행 인덱스로 설정
df.set_index(['열 이름'])df.set_index('열 이름')
특정 열을 행 인덱스로 사용할 수 있다. 이때 원본 객체를 변경하지 않고 새로운 객체를 반환한다. 만약 원본 객체에 할당하고 싶은 경우 inplace=True 옵션을 주면된다.
이때 행 인덱스를 여러개를 줄 수도 있으며, 이런 경우 MulitiIndex라고 하며, set_index() 로 새로 인덱스를 지정하면, 기존 행 인덱스는 삭제된다.
>>> df.set_index('수학') 영어 사회 과학 국어수학100987010010080898590807095809090939380867070809010080>>> df.set_index(['수학','영어']) 사회 과학 국어수학 영어100987010010080898590807095809090939380867070809010080
행 인덱스 재배열
df.reindex(새로운 인덱스 배열, fill_value=값)
기존 데이터프레임에 존재하지 않는 행 인덱스가 새롭게 추가되는 경우 NaN(Not a Number) 값이 입력된다. NaN대신 유효한 값을 채우려면 fill_value 옵션에 원하는 값을 입력하면된다.
>>> new_index = ['상혁','상호','우찬','진성','창동','NN']>>> df.reindex(new_index) 수학 영어 사회 과학 국어상혁 100.098.070.0100.0100.0상호 80.089.085.090.080.0우찬 70.095.080.090.090.0진성 93.093.080.086.070.0창동 70.080.090.0100.080.0NN NaN NaN NaN NaN NaN>>> df.reindex(new_index, fill_value=0) 수학 영어 사회 과학 국어상혁 1009870100100상호 8089859080우찬 7095809090진성 9393808670창동 70809010080NN 00000
행 인덱스 초기화
df.reset_index()
행 인덱스를 정수형 위치 인덱스로 초기화할 수 있다. 이때 기존 행 인덱스는 열로 이동한다.
>>> df.reset_index() index 수학 영어 사회 과학 국어0 상혁 10098701001001 상호 80898590802 우찬 70958090903 진성 93938086704 창동 70809010080
행 인덱스 기준으로 데이터 프레임 정렬
df.sort_index(ascending=True/False)# 오름차순/내림차순
ascending 옵션을 사용해 오름차순, 내림차순 정렬을 할 수 있다.
>>> df.sort_index() 수학 영어 사회 과학 국어상혁 1009870100100상호 8089859080우찬 7095809090진성 9393808670창동 70809010080>>> df.sort_index(ascending=False) 수학 영어 사회 과학 국어창동 70809010080진성 9393808670우찬 7095809090상호 8089859080상혁 1009870100100
특정 열의 데이터 값을 기준으로 DataFrame을 정렬할 수 있다.
df.sort_values()
ascending 옵션으로 오름차순, 내림차순 정렬을 설정할 수 있다.
>>> df.sort_values(by='수학') 수학 영어 사회 과학 국어우찬 7095809090창동 70809010080상호 8089859080진성 9393808670상혁 1009870100100>>> df.sort_values(by='과학', ascending=False) 수학 영어 사회 과학 국어상혁 1009870100100창동 70809010080상호 8089859080우찬 7095809090진성 9393808670
산술연산
Pandas 객체의 산술연산은 내부적으로 3단계 프로세스를 거친다.
행/열 인덱스 기준으로 모든 원소 정렬
→ 동일한 위치에 있는 원소끼리 일대일 대응
→ 일대일 대응되는 원소끼리 연산처리
이때 인덱스의 순서가 다르더라도 같은 인덱스를 찾아서 정렬한 후 계산한다. 연산하는 두 Series의 원소 개수가 다르거나, 인덱스 값이 다른 경우에는 NaN 처리를 한다.
>>> sr2 = df.loc['진성']['수학':'사회']
>>> sr2
수학 93
영어 93
사회 80
Name: 진성, dtype: int64
>>> sr = df.loc['상혁']['사회':'국어']
>>> sr
사회 70
과학 100
국어 100
Name: 상혁, dtype: int64
>>> sr+sr2
과학 NaN
국어 NaN
사회 150.0
수학 NaN
영어 NaN
dtype: float64
이때 NaN이 포함된 값의 연산은 모두 NaN처리가 된다. 이때 NaN으로 반환되는 경우를 피하려면 fill_value 옵션을 설정해 적용할 수 있다.
sr1.add(sr2,fill_value=0) # add, sub, mul, div
>>> sr.add(sr2, fill_value=0)
과학 100.0
국어 100.0
사회 150.0
수학 93.0
영어 93.0
dtype: float64
DataFrame 연산
DataFrame + 숫자
DataFrame + 연산자(+,-,/,*) + 숫자
모든 원소에 숫자를 연산자에 맞게 계산한다.
>>> df = titanic.loc[:, ['age','fare']]
>>> print(df.head()) # 첫 5행만 표시
age fare
0 22.0 7.2500
1 38.0 71.2833
2 26.0 7.9250
3 35.0 53.1000
4 35.0 8.0500
>>> df2 =df + 10
>>> df2.head()
age fare
0 32.0 17.2500
1 48.0 81.2833
2 36.0 17.9250
3 45.0 63.1000
4 45.0 18.0500
DataFrame + DataFrame
DataFrame + 연산자(+,-,/,*) + DataFrame
각 데이터 프레임의 같은 행, 같은 열 위치에 있는 원소끼리 계산하며, 어느 한쪽 원소가 존재하지 않거나 NaN이면 연산 결과는 NaN으로 처리한다.
>>> df2 =df + 10
>>> result=df2-df
>>> result.tail() # 마지막 5행
age fare
886 10.0 10.0
887 10.0 10.0
888 NaN 10.0
889 10.0 10.0
890 10.0 10.0