Python/NumPy | Pandas

[Python] Pandas - 데이터프레임 데이터 조작 1

비번변경 2022. 12. 20. 01:05

개요

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 데이터프레임의 데이터 조작