판다스(Pandas) 2

2024. 12. 18. 22:00LLM(Large Language Model)의 기초

판다스가 길어서 2로 이어서 하겠습니다.
 
예시 결과물은 길어서 캡쳐본 저장하였으니 궁금하시면 펼쳐보시면 됩니다.
 
평균과 중앙값 뒤부터 하겠습니다.
 
예시 1)

df_copy['height'].max() # 최대값
-->
182.0

 
예시 2)

df_copy['height'].var() # 분산
-->
52.203567251462

 
예시 3)

df_copy['height'].std() # 표준편차
-->
7.225203613149044

 
편차 와 분산 표준편차의 공식 

 
 
※ 분산과 표준편차
* 분산(Variance)과 표준편차(Standard Deviation)는 데이터가 평균에서 얼마나 퍼져 있는지를 나타내는 산포도(분포 정도)를 측정하는 지표입니다.
* 분산은 데이터가 평균을 기준으로 얼마나 퍼져 있는지를 나타냅니다.
* 평균에서 각 데이터의 거리를 제곱한 값들의 평균입니다.
* 표준편차는 분산의 제곱근입니다.
* 분산은 제곱 값이기 때문에 단위가 커질 수 있는데, 이를 원래 데이터와 같은 단위로 변환하기 위해 제곱근을 씌웁니다.
 
9. 그룹
 
예시 1)
데이터를 되돌립니다.

df_copy

-->

예시 2)

# groupby(): 데이터를 그룹으로 묶어 분석할 때 사용
df.groupby('group')
-->
<pandas.core.groupby.generic.DataFrameGroupBy object at 0x7b194a3c2200>

 
예시 3)

# 그룹을 맺으면 통계함수를 사용할 수 있음
df_copy.groupby('group').count()

-->

 
예시 4)

df_copy.groupby('group').mean(numeric_only=True)  #숫자형 열만을 대상으로 평균 계산.

-->

 
예시 5)

df_copy.groupby('group').sum(numeric_only=True) # 각 그룹의 숫자형 열에 대해 합계를 계산

-->

예시 6)

df_copy.groupby(['blood', 'gender']).mean(numeric_only=True)

-->

예시 7)

df_copy.groupby(['blood', 'gender'])['height'].mean()  #평균

-->

 
10. 중복 값 제거하기

df_copy['blood']

 
-->

 
예시 1)

#drop_duplicates() : 중복된 데이터 제거
df_copy['blood'].drop_duplicates()

-->

예시 2)

#value_counts() : 열의 각 값에 대한 데이터의 개수를 변환, 기본값은 NaN을 생략
df_copy['blood'].value_counts()

-->

 
예시 3)

df_copy['company'].value_counts() # 회사 소속인 사람

-->

예시 4)

df_copy['company'].value_counts(dropna=False) #NaN을 포함

-->

11. 데이터 프레임 합치기

df1 = pd.read_csv('/content/drive/MyDrive/KDT 시즌 4/10. 데이터분석/Data/idol.csv')
df2 = pd.read_csv('/content/drive/MyDrive/KDT 시즌 4/10. 데이터분석/Data/idol2.csv')

-->

df1

-->

df2

-->

 
예시 1)

df_copy = df1.copy()
pd.concat([df1, df_copy])

-->

 
예시 2)

dic = {
    '이름': '김사과',
    '연봉': 9000,
    '가족수': 10
}
df_concat = pd.concat([df1, df_copy])
df_concat.reset_index(drop=True) # 기존 인덱스 삭제

-->

예시 3)

pd.concat([df1, df2], axis=1)   # axis=1은 열 방향(가로)으로 병합

-->

 
예시 4)

df3 = df2.drop([1, 3, 5, 7, 9])
df3

-->

 
예시 5)

pd.concat([df1, df3], axis=1)

-->

 
예시 6)

df_right = df2.drop([1, 3, 5, 7, 9], axis=0) #axis=0은 행을 삭제
df_right

-->

 
예시 7)

df_right = df_right.reset_index(drop=True) # drop=True는 기존의 인덱스를 새로운 열로 추가하지 않고 삭제
df_right

-->

 
예시 8)

dic = {
    '이름': '김사과',
    '연봉': 9000,
    '가족수': 10
}

df_right = pd.concat([df_right, pd.DataFrame(dic, index=[0])], ignore_index=True)
df_right

-->

예시 9)

pd.concat([df1, df_right], axis=1)

-->

예시 10)

# merge () : 특정 고유한 키(unique, id) 값을 기준으로 합침
# merge(데이터프레임1, 데이터프레임2, on='유니크값', how='병합의 기준')
#병합의 기준 : left, right, inner, cross
pd.merge(df1, df_right, on='이름', how='left') #left는 왼쪽 조인(left join)을 수행합니다.

-->

예시 11)

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

-->

예시 12)

pd.merge(df1, df_right, on='이름', how='inner') # inner는 공통 '이름' 값만 결과에 포함

-->

 
예시 13)

pd.merge(df1, df_right, how='cross') # cross는 모든 행의 조합을 생성

-->

 
예시 14)

df_right.columns = ['성함', '연봉', '가족수'] # 열 이름 변경
df_right

-->

 
예시 15)

# pd.merge(df1, df_right, on='이름', how='right') # KeyError: '이름'
pd.merge(df1, df_right, left_on='이름', right_on='성함', how='right') # df_right에 있는 모든 '성함'이 결과에 포함

-->

12. 등수 매기기
 
예시 1)

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

-->

예시 2)

df1['브랜드순위'] = df1['브랜드평판지수'].rank(ascending=False) # ascending=False는 내림차순으로 순위를 매김
df1

-->

예시 3)

# astype(): 특정열의 자료형을 변경
df1['브랜드순위'] = df1['브랜드순위'].astype(int) # 열의 자료형을 정수형으로 변환
df1

-->

 
예시 4)

df1['브랜드순위'].dtypes
-->
dtype('int64')

 
13. 날짜타입 사용하기
df.info()

df.info()
-->
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 8 columns):
 #   Column    Non-Null Count  Dtype  
---  ------    --------------  -----  
 0   name      20 non-null     object 
 1   group     20 non-null     object 
 2   company   19 non-null     object 
 3   gender    20 non-null     object 
 4   birthday  20 non-null     object 
 5   height    19 non-null     float64
 6   blood     19 non-null     object 
 7   brand     20 non-null     int64  
dtypes: float64(1), int64(1), object(6)
memory usage: 1.4+ KB

 
예시 1)

df['birthday']

-->

예시 2)

# to_datetime() : object타입에서 datetime타입으로 변환
df['birthday'] = pd.to_datetime(df['birthday'])
print(type(df['birthday']))
print(df['birthday'].dtypes)
-->
<class 'pandas.core.series.Series'>
datetime64[ns]

 
예시 3)

df['birthday'].dt.year

 
-->

예시 4)

df['birthday'].dt.month

-->

예시 5)

df['birthday'].dt.day

-->

예시 6)

df['birthday'].dt.dayofweek #요일: 0(월요일) ~ 6(일요일) # dayofweek 각 날짜에 대해 요일을 숫자로 반환

 
예시 7)

df['birthday'].dt.isocalendar().week #dt.isocalendar().week는 날짜가 속한 ISO 주 번호를 반환

-->

14. apply 사용하기
* Pandas의 apply() 함수는 데이터프레임이나 시리즈의 데이터를 사용자 정의 함수 또는 내장 함수에 적용하여 새로운 값을 계산하거나 변환할 때 사용됩니다.
* 데이터를 행(row) 또는 열(column) 단위로 처리할 수 있는 강력한 도구입니다.
 
데이터를 되돌립니다.

df_copy = df.copy()
df_copy

-->

예시 1)

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

-->

 
예시 2)

df_copy = df.copy()
df_copy.head()

-->

예시 3)

#남자는 1, 여자는 0 반환 그 외에는 None
def male_or_female(x):
  if x == '남자':
    return 1
  elif x == '여자':
    return 0
  else:
    return None
    
print(male_or_female('남자'))   #1
print(male_or_female('여자'))   #0

 
예시 4)

df_copy['gender'].apply(male_or_female)

-->

예시 5)

df_copy['gender'].apply(lambda x:1 if x == '남자' else 0)

-->

예시 6)

df_copy['NewGender'] = df_copy['gender'].apply(lambda x:1 if x == '남자' else 0) # 'gender'열을 기반으로 'NewGender' 열 생성
df_copy.head() # 상위 5개 행 출력

-->

15. map 사용하기
* Pandas의 map() 함수는 Series 객체에서 사용할 수 있는 함수로, 각 요소에 대해 함수나 매핑 규칙을 적용하여 새로운 값을 계산하거나 변환할 때 사용됩니다.
* map()은 데이터의 각 요소를 순회하며 특정 작업을 수행하므로, 데이터를 가공하거나 변환하는 데 유용합니다.
 
일단 데이터를 되돌린다.

df_copy = df.copy()
df_copy.head()

-->

예시 1)

map_gender = {'남자':1, '여자':0}
df_copy['gender'].map(map_gender) # 'gender' 열을 기반으로 'gender' 열 생성

-->

예시 2)

df_copy['NewGender'] = df_copy['gender'].map(map_gender)  # 'gender' 열을 기반으로 'NewGender' 열 생성
df_copy.head()

-->

16. 데이터 프레임의 산술 연산
 
예시 1)

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

df1

-->

예시 2)

df1['파이썬'].dtypes
-->
dtype('int64')

 
예시 3)

type(df1['파이썬'])
-->
pandas.core.series.Series
def __init__(data=None, index=None, dtype: Dtype | None=None, name=None, copy: bool | None=None, fastpath: bool | lib.NoDefault=lib.no_default) -> None

 
예시 4)

df1['파이썬'] + df1['데이터분석'] + df1['머신러닝딥러닝']

-->

예시 5)

df1['총점'] = df1['파이썬'] + df1['데이터분석'] + df1['머신러닝딥러닝']
df1['평균'] = df1['총점'] / 3
df1

-->

예시 6)

df1['파이썬'].sum() # df1['파이썬'].sum(axis=0)
-->
395

 
예시 7)

df1['파이썬'].mean()
-->
79.0

 
예시 8)

df1.sum()

-->

예시 9)

df1.mean()

-->

예시 10)

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

df2 = pd.DataFrame({
    '파이썬':['C', 'B', 'B', 'A', 'A'],
    '데이터분석':[40, 60, 70, 55, 87],
    '머신러닝딥러닝':[35, 40, 30, 70, 55]
})

 
예시10-1)

df1 + 10

-->

 
예시 10-2)

#df2 + 10 이건 되지 않는다

 
예시 11)

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

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

 
예시 11-1)

df1 + df2 # 행의 개수가 다를 경우 빠진 데이터를 NaN으로 취급하기 때문에 결과는 NaN

-->

17. select_dtypes
 
데이터를 되돌린다.

df_copy = df.copy()
df_copy.head()

-->

예시 1)

df.info()
-->
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 8 columns):
 #   Column    Non-Null Count  Dtype         
---  ------    --------------  -----         
 0   name      20 non-null     object        
 1   group     20 non-null     object        
 2   company   19 non-null     object        
 3   gender    20 non-null     object        
 4   birthday  20 non-null     datetime64[ns]
 5   height    19 non-null     float64       
 6   blood     19 non-null     object        
 7   brand     20 non-null     int64         
dtypes: datetime64[ns](1), float64(1), int64(1), object(5)
memory usage: 1.4+ KB

 
예시 2)

df.select_dtypes(include='object') # # 문자열형 열만 선택

-->

예시 3)

df.select_dtypes(exclude='object') # 문자열형 열을 제외하고 나머지 열만 선택

-->

예시 4)

df.select_dtypes(exclude='object').head() # 문자열형 열을 제외한 나머지 열을 선택 #head():상위 5개의 행을 확인

 
예시 5)

df.select_dtypes(exclude=['object' , 'datetime64[ns]']) + 10 # 숫자형 열에 10을 더하기

-->

예시 6)

# str_cols는 데이터프레임에서 문자열형(object) 열의 이름들을 저장
str_cols = df.select_dtypes(include='object').columns
str_cols
-->
Index(['name', 'group', 'company', 'gender', 'blood'], dtype='object')

 
예시 7)

df[str_cols]

-->

18. get_dummis()
get_dummies()는 Pandas에서 범주형 데이터를 원-핫 인코딩(one-hot encoding) 방식으로 변환하는 데 사용됩니다.

> 원-핫 인코딩
* 원-핫 인코딩은 각 범주를 별도의 열로 변환하고, 해당 범주에 해당하는 곳에 1을, 나머지에는 0을 채우는 방식입니다.
* 예를 들어, 데이터가 "Red", "Green", "Blue"와 같은 문자열이라면, 모델은 이를 이해하지 못합니다.
* 범주형 데이터를 숫자로 변환해야 모델이 계산할 수 있습니다.
* 원-핫 인코딩은 범주형 데이터를 숫자로 변환하면서도 각 범주 간의 순서나 크기를 부여하지 않습니다.
 
 
예시 1)

blood_map = {'A': 0, 'B': 1, 'AB' : 2, '0': 3} # 혈액형 매핑 딕셔너리
df['blood_code'] = df['blood'].map(blood_map)  # 'blood' 열을 'blood_code'로 변환 
df.head()

-->

예시 2)

# pd.get_dummies()는 범주형 데이터를 원-핫 인코딩하여 더미 변수를 생성
# 0과 1을 True or False로 표현
pd.get_dummies(df['blood'])

-->

예시 3)

#혈액형별로 a, ab, b, o형을 true or false로 표현
df = pd.get_dummies(df, columns=['blood'])
df

-->

예시 4)

df.info()
-->
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20 entries, 0 to 19
Data columns (total 12 columns):
 #   Column      Non-Null Count  Dtype         
---  ------      --------------  -----         
 0   name        20 non-null     object        
 1   group       20 non-null     object        
 2   company     19 non-null     object        
 3   gender      20 non-null     object        
 4   birthday    20 non-null     datetime64[ns]
 5   height      19 non-null     float64       
 6   brand       20 non-null     int64         
 7   blood_code  16 non-null     float64       
 8   blood_A     20 non-null     bool          
 9   blood_AB    20 non-null     bool          
 10  blood_B     20 non-null     bool          
 11  blood_O     20 non-null     bool          
dtypes: bool(4), datetime64[ns](1), float64(2), int64(1), object(4)
memory usage: 1.5+ KB
728x90
LIST

'LLM(Large Language Model)의 기초' 카테고리의 다른 글

Matplotlib  (4) 2024.12.19
4. Online Retail 데이터셋  (1) 2024.12.18
1. 판다스(Pandas)  (2) 2024.12.17
9. 넘파이(Numpy)  (0) 2024.12.16
FAST API  (8) 2024.12.13