본문 바로가기
데이터 분석

판다스3

by 코낄2 2023. 12. 8.

1. 데이터 프레임 합치기

  • concat() : 데이터를 합침

판다스 1.0.0 버전부터는 sort 매개변수의 기본값이 sort=True에서 sort=False로 변경되었습니다. sort=False일 경우 인덱스 순서가 유지되어 기존 데이터프레임의 순서대로 합쳐집니다. 하지만 명시적으로 sort=True를 설정하여 정렬을 요구하는 경우에는 인덱스에 따라 정렬이 이루어집니다.

  • reset_index() : index를 새롭게 적용⭐
  • reset_index(drop = True) : 기존의 index를 없앰
  • pd.concat([df1, df2], axis = 1) : 같은 index를 기준으로 열을 결합함.

왼쪽 위 : pd.concat([df.1, df_copy])    /   오른쪽 위 : df.concat.reset_index(drop = True)

아래 : pd.concat([df.1, df2], axis = 1)

 

  • merge() : 판다스에서 데이터프레임을 병합(merge)하는 데에 사용되는 함수로, SQL의 JOIN 연산과 유사한 동작을 합니다. how: 병합 방법 ('left', 'right', 'outer', 'inner' 중 하나) /  on: 기준이 되는 열(컬럼)의 이름 또는 여러 열의 이름.
pd.merge(df1, df_right, on='이름',how='left')
pd.merge(df1, df_right, on='이름',how='inner')

pd.merge(df1, df_right, on='이름',how='left')
pd.merge(df1, df_right, on='이름',how='inner')

  • rank() : 데이터프레임 또는 시리즈의 순위를 매기는 함수. 기본값은 ascending
df1['브랜드순위'] = df1['브랜드평판지수'].rank()
df1['브랜드순위'] = df1['브랜드평판지수'].rank(ascending=False)

df1['브랜드순위'] = df1['브랜드평판지수'].rank()
df1['브랜드순위'] = df1['브랜드평판지수'].rank(ascending=False)

  • astype() : 특정열의 자료형을 변경⭐
df1['브랜드순위'] = df1['브랜드순위'].astype(int)

브랜드 순위가 int로 변경

2. 날짜타입 사용하기

  • to_datetime() : Object 타입에서 datetime타입으로 변환
  • .dt.year / dt.month / dt.day / dt.hour / dt.minute / dt.second / dt.dayofweek( 0~6 : 월요일~ 일요일)
df['birthday'] = pd.to_datetime(df['birthday'])

Name: birthday, dtype: datetime64[ns]
df['birthday'].dt.day
0     13
1     18
2     10
3     30
4     23
5      1
6      9
7     26
8      4
9     22
10     9
11    30
12    21
13     8
14     9
15     1
Name: birthday, dtype: int64

df['birthday'].dt.isocalendar().week
// 1년 중에 몇번째 주인지 출력
0     41
1     33
2     50
3     52
4     29
5     36
6     32
7     35
8     49
9     12
10    10
11    13
12    29
13    23
14    10
15    52
Name: week, dtype: UInt32

3. apply 사용하기

apply() 함수는 판다스에서 데이터프레임이나 시리즈의 각 원소에 함수를 적용하는 데 사용되는 유용한 메서드입니다. 이 함수를 사용하면 사용자가 정의한 함수나 내장 함수를 데이터프레임의 행이나 열에 적용할 수 있습니다. apply를 적용하기 위해서는 별도의 함수가 먼저 정의되어야 합니다. 작성된 함수를 apply에 매개변수로 전달합니다.

# 성별이 남자는 1, 여자는 0으로 변환(loc를 사용)
df.loc[df['gender']=='남자', 'gender'] = 1
df.loc[df['gender']=='여자', 'gender'] = 0

df.head()

def male_or_female(x):
    if x == '남자':
        return 1
    elif x == '여자':
        return 0
        
df['성별'].apply(male_or_female)
0     1
1     1
2     1
3     1
4     0
5     1
6     1
7     0
8     1
9     1
10    0
11    1
12    1
13    1
14    1
Name: 성별, dtype: int64
df['성별'].apply(lambda x: 1 if x =='남자' else 0)
0     1
1     1
2     1
3     1
4     0
5     1
6     1
7     0
8     1
9     1
10    0
11    1
12    1
13    1
14    1
Name: 성별, dtype: int64
  • map 사용하기
map_gender = {'남자': 1, '여자': 0}
df['성별'].map(map_gender)
0     1
1     1
2     1
3     1
4     0
5     1
6     1
7     0
8     1
9     1
10    0
11    1
12    1
13    1
14    1
Name: 성별, dtype: int64

4. 데이터프레임의 산술연산

df = pd.DataFrame({
    '파이썬': [60, 70, 80 ,86 , 95],
    '데이터분석': [40, 60, 70, 55, 88],
    '머신러닝딥러닝': [90, 40, 30, 100, 55]
})

df

df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']
0    190
1    170
2    180
3    241
4    238
dtype: int64

df['총점'] = df['파이썬'] + df['데이터분석'] + df['머신러닝딥러닝']
	파이썬	데이터분석	머신러닝딥러닝	총점
0	60	40		90		190
1	70	60		40		170
2	80	70		30		180
3	86	55		100		241
4	95	88		55		238

df['파이썬'].sum()  = df['파이썬'].sum(axis=0)
// 391

df['파이썬'].mean()
// 78.2

df.mean()
파이썬         78.200000
데이터분석       62.600000
머신러닝딥러닝     63.000000
총점         203.800000
평균          67.933333
dtype: float64
df1 = pd.DataFrame({
    '파이썬': [60, 70, 80 ,86 , 95],
    '데이터분석': [40, 60, 70, 55, 88],
    '머신러닝딥러닝': [90, 40, 30, 100, 55]
})

df1 + 10 # 모든 요소에 10을 더함
	파이썬	데이터분석	머신러닝딥러닝
0	70	50		100
1	80	70		50
2	90	80		40
3	96	65		110
4	105	98		65
df1 = pd.DataFrame({
    '데이터분석': [40, 60, 70, 55, 88],
    '머신러닝딥러닝': [90, 40, 30, 100, 55]
})

df2 = pd.DataFrame({
    '데이터분석': [40, 60, 70, 55],
    '머신러닝딥러닝': [90, 40, 30, 100]
})

df1 + df2
# 행의 갯수가 다른 경우 빠진 데이터를 NaN으로 취급하고 연산하지 않는다

	데이터분석	머신러닝딥러닝
0	80.0		180.0
1	120.0		80.0
2	140.0		60.0
3	110.0		200.0
4	NaN		NaN

5. select_dtypes

df.select_dtypes(include = 'object') # 문자열 컬럼만 가져오기
df.select_dtypes(exclude = 'object') # 문자열 컬럼만 빼고 가져오기
df.select_dtypes(exclude = 'object') +10 # 문자열 컬럼 제외한 값들에 모두 10 더하기

# 문자열을 가지고 있는 컬럼의 이름만 저장
str_cols = df.select_dtypes(include='object').columns
print(str_cols)
Index(['이름', '그룹', '소속사', '성별', '생년월일', '혈액형'], dtype='object')

6. 원 핫 인코딩(One Hot Encoding)

원 핫 인코딩은 한개의 요소는 1, 나머지 요소는 0으로 만들어 카테고리형을 표현하는 방법입니다. 예를 들어, 머신러닝/ 딥러닝에는 숫자형 데이터를 넣어야 하기 때문에 df['혈액형']을 머신러닝/딥러닝 알고리즘에 [ 'A': 0, 'B': 1, 'AB' : 2, 'O': 3 ]으로 넣어 데이터를 예측하려고 하면 컴퓨터는 값들간의 관계를 스스로 형성할 수 있습니다. B형은 1, AB형은 2라는 값을 가지고 있기 떄문에 컴퓨터는 'B형 + AB형 = 0형'이라는 이상한 관계를 맺을 수도 있습니다. 따라서 별도의 column들을 형성해주고 1개의 column에는 1, 나머지 column에는 0으로 넣어줌으로 'A, B, AB, O형의 관계는 서로 독립적이다'라는 카테고리로 표현해주는 방식을 사용합니다.

  • "A"는 [1, 0, 0, 0]
  • "B"는 [0, 1, 0, 0]
  • "AB"는 [0, 0, 1, 0]
  • "O"는 [0, 0, 0, 1]
 ✔️ 라벨 인코딩
blood_map = {'A': 0, 'B': 1, 'AB' : 2, 'O': 3}
df['혈액형_code'] = df['혈액형'].map(blood_map)
df.head()

	이름		그룹		소속사	성별	생년월일	키	혈액형	브랜드평판지수	혈액형_code
0	지민		방탄소년단	빅히트	남자	1995-10-13	173.6	A	10523260	0
1	지드래곤		빅뱅		YG	남자	1988-08-18	177.0	A	9916947		0
2	강다니엘		NaN		커넥트	남자	1996-12-10	180.0	A	8273745		0
3	뷔		방탄소년단	빅히트	남자	1995-12-30	178.0	AB	8073501		2
4	화사		마마무		RBW	여자	1995-07-23	162.1	A	7650928		0
⭐ pd.get_dummies(): 원 핫 인코딩을 적용
pd.get_dummies(df['혈액형_code'])

	0	1	2	3
0	1	0	0	0
1	1	0	0	0
2	1	0	0	0
3	0	0	1	0
4	1	0	0	0

df = pd.get_dummies(df, columns = ['혈액형_code'])
df.info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 15 entries, 0 to 14
Data columns (total 12 columns):
 #   Column      Non-Null Count  Dtype  
---  ------      --------------  -----  
 0   이름          15 non-null     object 
 1   그룹          14 non-null     object 
 2   소속사         15 non-null     object 
 3   성별          15 non-null     object 
 4   생년월일        15 non-null     object 
 5   키           13 non-null     float64
 6   혈액형         15 non-null     object 
 7   브랜드평판지수     15 non-null     int64  
 8   혈액형_code_0  15 non-null     uint8  
 9   혈액형_code_1  15 non-null     uint8  
 10  혈액형_code_2  15 non-null     uint8  
 11  혈액형_code_3  15 non-null     uint8  
dtypes: float64(1), int64(1), object(6), uint8(4)
memory usage: 1.1+ KB

'데이터 분석' 카테고리의 다른 글

가상 쇼핑몰 데이터 예제  (0) 2023.12.16
Matplotlib  (0) 2023.12.10
판다스2  (0) 2023.12.08
판다스1  (0) 2023.12.05
넘파이  (0) 2023.11.28