회사에서 시험을 볼때 오픈북이라 가볍게 생각했는데 응용문제가 나오니 (책에 없는)

기초가 탄탄하지 않은 것이 금방 탄로가 났다. 그래서 연습용으로 내가 스스로 만든 기본함수 예제편을 만들어 둔다.

 

 

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)

+ Recent posts