Intro
무턱대고 딥러닝에 뛰어들다 보니 같은 연구실의 사람들에 비해 데이터를 처리하는 능력이 부족하다고 느껴서 numpy와 pandas에 대한 이해도의 필요성을 크게 느껴 공부를 진행해보려한다. numpy는 직접 다루기가 어려워서 대부분 pandas를 이용한다고 하여 우선 pandas에 대한 이해도를 끌어올리기 위하여 pandas 공부를 시작한다.
Pandas.DataFrame 클래스 구조
pandas dataframe 객체는 기본적으로 아래와 같은 클래스로 생성이 된다.
class pandas.DataFrame(data=None, index=None, columns=None, copy=None)
pandas.DataFrame으로 생성된 인스턴스는 크기의 변경이 가능한 2차원 배열이다. 데이터 구조에는 레이블이 지정된 축인 행과 열까지 포함되며, 클래스 매서드를 통해 레이블의 수정이 가능하다.
네가지 파라미터를 살펴보면 아래와 같다.
data : ndarray, Iterable, dict, DataFrame
dict에는 Series, 배열 등등 list와 유사한 오브젝트가 올 수 있습니다.
데이터가 dict인 경우 열(Columns)의 순서는 삽입 순서를 따릅니다.
index : 인덱스 또는 배열형태의 객체
인스턴스에 설정되는 행 레이블입니다. 입력하지 않으면 기본 인덱스가 설정된다. (0, 1, 2, 3...)
columns : 인덱스 또는 배열형태의 객체
인스턴스에 설정되는 열 레이블입니다. 입력하지 않으면 기본 인덱스가 설정된다. (0, 1, 2, 3...)
dtype : dtype 데이터 유형을 강제하고자 할때 값이다. 기본값은 None이며 None일경우 type이 자동으로 추론된다.
copy : bool
Ture 일 경우 Dataframe의 원본 데이터를 수정하더라도 인스턴스가 변경되지 않지만
False일 경우 원본데이터를 수정할 시 인스턴스의 값도 바뀌게 된다.
np.random.seed(0)
arr = np.random.randint(10, size=(2, 2)) # 2*2 짜리 random array 생성
print(arr)
>>
[[3 8]
[5 1]]
df1 = pd.DataFrame(arr, copy=False)
df2 = pd.DataFrame(arr, copy=True)
arr[0,0] = 99
print(df1)
>>
0 1
0 99 8
1 5 1
print(df2)
>>
0 1
0 3 8
1 5 1
copy가 false인 df1은 0,0이 99로 바뀐 반면 copy가 true인 df2는 0,0이 3으로 유지되는 것을 볼 수 있다.
예시
dictionary로 만들기
데이터 자체가 2차원 배열형태일 경우 data만 설정해주어도 dataframe 객체의 생성이 가능하다.
data = {'A' : [1,2], 'B': [3,4]}
df = pd.DataFrame(data=data)
print(df)
>>
A B
0 1 2
1 3 4
index, column 설정
data = np.array([1,2,], [3,4])
df = pd.DataFrame(data=data, index=['row1','row2'], columns=['col1', 'col2'])
print(df)
>>
col1 col2
row1 1 2
row2 3 4
객체간 연산
우선 DataFrame과같은 객체간의 연산을 하는 경우에 대해서 알아보자.
덧셈
덧셈에는 add와 radd가 있다.
DataFrame.add(other, axis='columns', level=None, fill_value=None)
DataFrame.radd(other, axis='columns', level=None, fill_value=None)
radd의 경우 add의 경우에서 순서만 바꾼것이다. 즉 add가 'df+df2'라면 radd는 'df2+df'이다.
기본 사용법
df.add(other, axis='columns', level=None, fill_value=None)
other : 데이터프레임이나, Series, 스칼라 등 데이터가 올 수 있다. 더할 값이다.
axis : 더할 레이블을 설정한다. 0은 행, 1은 열이다.
level : multiIndex에서 계산할 Index의 레벨이다.
fill_value : NaN 값등의 누락 요소를 계산 전에 이 값으로 대체한다.
data = [[1,10,100],[2,20,200],[3,30,300]]
col = ['col1','col2','col3']
row = ['row1','row2','row3']
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)
>>
col1 col2 col3
row1 1 10 100
row2 2 20 200
row3 3 30 300
result = df.add(1)
print(result)
>>
col1 col2 col3
row1 2 11 101
row2 3 21 201
row3 4 31 301
result = df+1
print(result)
>>
col1 col2 col3
row1 2 11 101
row2 3 21 201
row3 4 31 301
df.add(1)은 df+1과 같은 결과를 출력함을 알 수 있다.
#df에 더할 df2를 아래와 같이 만들어보자. 3x1 짜리 객체로 col1을 가진다.
data2 = [[3],[4],[5]]
df2 = pd.DataFrame(data=data2,index=['row1','row2','row3'],columns=['col1'])
print(df2)
>>
col1
row1 3
row2 4
row3 5
#이제 df에 df2를 add메서드를 통해 더해보자.
#df2에는 col2과 col3열이 없기 때문에 해당 열의 계산결과는 NaN으로 반환된다.
result = df.add(df2)
print(result)
>>
col1 col2 col3
row1 4 NaN NaN
row2 6 NaN NaN
row3 8 NaN NaN
#fill_value 인수를 통해 해당 오류를 출력 가능하도록 바꿔보도록 하자.
result = df.add(df2,fill_value=0)
print(result)
col1 col2 col3
row1 4 10.0 100.0
row2 6 20.0 200.0
row3 8 30.0 300.0
#df2에는 존재하지 않던 col2, col3의 요소들에 대해 fill_value값인 0으로 채워 넣은 뒤 계산을 진행한다.
뺄셈 (sub, rsub)
DataFrame.sub(other, axis='columns', level=None, fill_value=None)
DataFrame.rsub(other, axis='columns', level=None, fill_value=None)
단순 df - 다른df 등의 계산과 차별화되는 것은fill_value 인수를 통해 계산 불가한 값을 채워 넣는다는 것이다.
rsub의 경우 sub의 경우에서 순서만 바꾼것이다. 즉 sub가 'df-df2'라면 rsub는 'df2-df'이다.
기본 사용법
df.sub(other, axis='columns', level=None, fill_value=None)
other : 데이터프레임이나, Series, 스칼라 등 데이터가 올 수 있다. 뺄 값이다.
axis : 뺄 레이블을 설정합니다. 0은 행, 1은 열이다.
level : multiIndex에서 계산할 Index의 레벨이다.
fill_value : NaN 값등의 누락 요소를 계산 전에 이 값으로 대체한다.
data = [[1,10,100],[2,20,200],[3,30,300]]
col = ['col1','col2','col3']
row = ['row1','row2','row3']
df = pd.DataFrame(data=data,index=row,columns=col)
print(df)
>>
col1 col2 col3
row1 1 10 100
row2 2 20 200
row3 3 30 300
result = df.sub(1)
print(result)
>>
col1 col2 col3
row1 0 9 99
row2 1 19 199
row3 2 29 299
result = df-1
print(result)
>>
col1 col2 col3
row1 0 9 99
row2 1 19 199
row3 2 29 299
덧셈에서 봤던것과 같이 스칼라 값을 직접 빼는 것과 sub로 빼는 것은 같은 결과물을 낸다.
#df에 뺄 df2를 아래와 같이 만들어보자. 3x1 짜리 객체로 col1을 가진다.
data2 = [[3],[4],[5]]
df2 = pd.DataFrame(data=data2,index=['row1','row2','row3'],columns=['col1'])
print(df2)
>>
col1
row1 3
row2 4
row3 5
#이제 df에 df2를 sub메서드를 통해 빼보자.
#df2에는 col2과 col3열이 없기 때문에 해당 열의 계산결과는 NaN으로 반환된다.
result = df.sub(df2)
print(result)
>>
col1 col2 col3
row1 -2 NaN NaN
row2 -2 NaN NaN
row3 -2 NaN NaN
#fill_value 인수를 통해 해당 오류를 출력 가능하도록 바꿔보도록 하자.
result = df.sub(df2,fill_value=0)
print(result)
col1 col2 col3
row1 -2 10.0 100.0
row2 -2 20.0 200.0
row3 -2 30.0 300.0
#df2에는 존재하지 않던 col2, col3의 요소들에 대해 fill_value값인 0으로 채워 넣은 뒤 계산을 진행하였다.
'Sketch (Programming Language) > Python' 카테고리의 다른 글
Pandas(3) (0) | 2023.08.23 |
---|---|
Pandas(2) (0) | 2023.08.21 |
Baekjoon Training #1904 (0) | 2023.08.18 |
Baekjoon Training #12865 (0) | 2023.08.06 |
Baekjoon Training #10828 (0) | 2023.07.24 |