회사에서 시험을 볼때 오픈북이라 가볍게 생각했는데 응용문제가 나오니 (책에 없는)
기초가 탄탄하지 않은 것이 금방 탄로가 났다. 그래서 연습용으로 내가 스스로 만든 기본함수 예제편을 만들어 둔다.
pandas 를 사용해서 나이계산하기
- 예제 엑셀 위치 : data_set\인원정보.xlsx
예제1) iterrows() 함수를 사용해서 두가지 방법으로 나이의 평균을 계산하시오.
조건)
- 한번은 2000년대생을 1900년대생으로 통일해서 계산하고 (e.g. 04년생 -> 1904년생) 다른 한번은 2000년대생을 올바르게 계산 (e.g.04년생 -> 2004년생)
결과)
74.5 / 34.5
코드)
import pandas as pd
df = pd.read_excel('data_set\\인원정보.xlsx')
df['생년']=df['주민등록번호'].str[0:2]
df['생년']=df['생년'].astype(int)
df['나이1'] = 2024-(1900+df['생년'])
age1 = df['나이1'].mean(axis=0)
for idx, row in df.iterrows():
if df.loc[idx,'생년'] > 24:
df.loc[idx,'나이2'] = 2024-(1900+row['생년'])
else:
df.loc[idx,'나이2'] = 2024-(2000+row['생년'])
age2 = df['나이2'].mean(axis=0)
print(age1,age2)
#다른 코드
import pandas as pd
df = pd.read_excel('data_set\인원정보.xlsx')
df['출생연도']=df['주민등록번호'].str[0:2]
df['출생연도']=df['출생연도'].astype(int)
for idx,row in df.iterrows():
if df.loc[idx, '출생연도'] < 24:
df.loc[idx, '출생연도'] = 2000 + row['출생연도']
else:
df.loc[idx, '출생연도'] = 1900 + row['출생연도']
df['나이']=2024 -df['출생연도']
age_mean = df['나이'].mean(axis=0)
age_mean
예제2) 남자, 여자 성별별로 나이평균을 구하시오
결과)
남자 34.5
여자 34.5
코드)
gen_loc = df['주민등록번호'].str.find('-')[0]
df['성별']= df['주민등록번호'].str[gen_loc+1:gen_loc+2]
for idx, row in df.iterrows():
if (df.loc[idx,'성별'] == '1') or (df.loc[idx,'성별'] == '3'):
df.loc[idx, '성별1'] = '남자'
else:
df.loc[idx, '성별1'] = '여자'
df.groupby(['성별1'])['나이2'].mean()
#다른 코드
df['성별']=df['주민등록번호'].str[df['주민등록번호'].str.find('-')[0]+1:df['주민등록번호'].str.find('-')[0]+2]
df['성별']=df['성별'].replace('1','남자').replace('3','남자').replace('4','여자').replace('2','여자')
df.groupby(['성별'])['나이'].mean()
예제3) 여성의 이름을 나이가 적은 순서대로 정렬하시오, 단 성은 대문자로, 이름은 첫글자만 대문자로 표현하시오
space = []
for i in range(len(df)):
space.append(df['영문명'][i].find(" "))
df['공백'] = space
for idx, row in df.iterrows():
name = df.loc[idx,'영문명']
df.loc[idx,'영문성'] = name[0:row['공백']].upper()
df.loc[idx,'영문이름'] = name[row['공백']+1:].capitalize()
df_sbv = df.sort_values(by='나이2', ascending=True)
df_sbv['Full Name']=df_sbv['영문이름']+', '+df_sbv['영문성']
name_girl = df_sbv.loc[df_sbv['성별1']=='여자']
name_girl.reset_index(inplace=True)
age = []
for i in range(len(name_girl)):
age.append(round(name_girl['나이2'][i]))
name_girl['나이']=age
name_girl
for i in range(len(name_girl)):
print(str(i+1)+'위:'+name_girl['Full Name'][i]+'('+name_girl['나이'][i].astype(str)+'세)')
예제4) 두 테이블을 outer로 조인하여 시가총액 상위 5개 회사를 나타내시오
- Table1) data_set/업종 및 주식정보.xlsx (업종정보 sheet 전부)
- Table1) data_set/업종 및 주식정보.xlsx (주식정보 sheet 에서 기업명, 상장시가총액(원) only )
- 사용함수 : pandas 패키지의 merge 함수
import pandas as pd
df1 = pd.read_excel('data_set/업종 및 주식정보.xlsx', '업종정보', index_col = 'id')
df2 = pd.read_excel('data_set/업종 및 주식정보.xlsx', '주식정보', index_col = 'id').loc[:, ['기업명', '상장시가총액(원)']]
display(df1, df2)# 엑셀 vlookup을 대체할 수 있는 코드
df_results = pd.merge(df1, df2, on='기업명', how='outer')
# df_results.to_excel('merge_results.xlsx', sheet_name = '업종정보_시총정보 포함', header = True, index = False)
df_null = df_results.loc[df_results['종목코드'].isnull()]
df_null.reset_index(inplace=True)
df_null['시가총액']=df_null['상장시가총액(원)'].str.replace(',','')
df_null['시가총액']=pd.to_numeric(df_null['시가총액'])
df_null['시가총액(억원)']=df_null['시가총액']/(10**8)
df_null['시가총액(억원)']=df_null['시가총액(억원)'].astype(int)
df_null.sort_values(by='시가총액(억원)', ascending=False).head(5)
'New Collar Level 2' 카테고리의 다른 글
웹페이지를 파싱해서 데이터프레임으로 가져오기 (0) | 2024.05.06 |
---|---|
MS그림판으로 자동으로 그림그리기 (0) | 2024.05.06 |
주피터 시작 - 명령어창에서 상대경로 찾는 법 (1) | 2024.03.18 |
네이버 메일의 본문을 자동 입력하기 [미완성] (0) | 2024.03.17 |
VDI로 띄운 창을 제어하기 [미완성] (0) | 2024.03.17 |