개요
Pandas는 NumPy 2차원 배열에서 가능한 대부분의 데이터 처리를 할 수 있다.
어떤 기능을 제공하는지 정리해둔다.
count
NaN을 제외한 데이터의 개수를 센다. DataFrame의 경우 열 마다 개수를 세기 때문에 누락된 부분을 찾을 때 유용하다.
데이터가 아래와 같다고 하자.
np.random.seed(2)
df = pd.DataFrame(np.random.randint(5, size=(4, 4)), dtype=float)
df.iloc[2, 3] = np.nan
df
# 실행 결과
0 1 2 3
0 0.0 0.0 3.0 2.0
1 3.0 0.0 2.0 1.0
2 3.0 2.0 4.0 NaN
3 4.0 3.0 4.0 2.0
이 데이터 각 열의 개수는 4 4 4 3이다.
df.count()
# 실행 결과
0 4
1 4
2 4
3 3
dtype: int64
카테고리 값 세기
Series의 값이 정수, 문자열, 카테고리인 경우에는 value_counts 함수로 각 값이 나온 횟수를 셀 수 있다.
np.random.seed(1)
s2 = pd.Series(np.random.randint(6, size=100))
s2.value_counts()
# 실행 결과
1 22
0 18
4 17
5 16
3 14
2 13
dtype: int64
DataFrame은 각 열마다 별도로 적용해야 한다.
for i in df.index:
print(df[i].value_counts())
# 실행 결과
3.0 2
0.0 1
4.0 1
Name: 0, dtype: int64
0.0 2
2.0 1
3.0 1
Name: 1, dtype: int64
4.0 2
3.0 1
2.0 1
Name: 2, dtype: int64
2.0 2
1.0 1
Name: 3, dtype: int64
정렬
인덱스 값을 기준으로 데이터를 정렬할 때는 sort_index 함수를, 데이터 값을 기준으로 정렬할 때는 sort_values 함수를 사용한다.
위의 s2 Series의 각 데이터 값에 따른 개수를 인덱스를 기준으로 정렬할 때는 아래와 같이 사용한다.
np.random.seed(1)
s2 = pd.Series(np.random.randint(6, size=100))
s2.value_counts().sort_index()
# 실행 결과
0 18
1 22
2 13
3 14
4 17
5 16
dtype: int64
NaN이 있는 경우에는 NaN이 가장 나중으로 간다.
s = pd.Series(range(10))
s[2] = np.nan
s.sort_values()
# 실행 결과
0 0.0
1 1.0
3 3.0
4 4.0
5 5.0
6 6.0
7 7.0
8 8.0
9 9.0
2 NaN
dtype: float64
내림차순으로 정렬할 때는 ascending 매개변수를 False로 설정한다.
s.sort_values(ascending=False)
# 실행 결과
9 9.0
8 8.0
7 7.0
6 6.0
5 5.0
4 4.0
3 3.0
1 1.0
0 0.0
2 NaN
dtype: float64
DafaFrame의 경우 by 매개변수로 정렬 기준이 될 열을 지정해야 한다.
df.sort_values(by=1)
# 실행 결과
0 1 2 3
0 0.0 0.0 3.0 2.0
1 3.0 0.0 2.0 1.0
2 3.0 2.0 4.0 NaN
3 4.0 3.0 4.0 2.0
by 매개변수에 리스트를 전달하면 나열한 열 순서대로 우선순위를 가진다. 첫 번째 열을 기준으로 정렬한 뒤 동일한 값이 나오면 다음 열을 기준으로 순서를 따진다.
df.sort_values(by=[1, 2])
# 실행 결과
0 1 2 3
1 3.0 0.0 2.0 1.0
0 0.0 0.0 3.0 2.0
2 3.0 2.0 4.0 NaN
3 4.0 3.0 4.0 2.0
행/열 합계
행과 열의 합계는 sum 함수로 구한다. axis 매개변수로 합계 연산에 의해 없어지는 방향축을 지정한다. 행은 0으로, 열은 1로 지정한다.
데이터가 아래와 같다고 하자.
np.random.seed(1)
df2 = pd.DataFrame(np.random.randint(10, size=(4, 8)))
df2
# 실행 결과
0 1 2 3 4 5 6 7
0 5 8 9 5 0 0 1 7
1 6 9 2 4 5 2 4 2
2 4 7 7 9 1 7 0 6
3 9 9 7 6 9 1 0 1
행의 합계는 다음과 같이 계산한다.
df2['rowSum'] = df2.sum(axis=1)
df2
# 실행 결과
0 1 2 3 4 5 6 7 rowSum
0 5 8 9 5 0 0 1 7 35
1 6 9 2 4 5 2 4 2 34
2 4 7 7 9 1 7 0 6 41
3 9 9 7 6 9 1 0 1 42
열 방향 합계를 구할 때는 다음과 같이 계산한다. axis 매개변수는 기본값이 0이므로 생략할 수 있다.
df2.loc['colSum', :] = df2.sum()
df2
# 실행 결과
0 1 2 3 4 5 6 7 rowSum
0 5.0 8.0 9.0 5.0 0.0 0.0 1.0 7.0 35.0
1 6.0 9.0 2.0 4.0 5.0 2.0 4.0 2.0 34.0
2 4.0 7.0 7.0 9.0 1.0 7.0 0.0 6.0 41.0
3 9.0 9.0 7.0 6.0 9.0 1.0 0.0 1.0 42.0
colSum 24.0 33.0 25.0 24.0 15.0 10.0 5.0 16.0 152.0
참고 문서
데이터 사이언스 스쿨 - 4.4 데이터프레임의 데이터 조작