ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • pandas dataframe 정리
    DataAnalysis/개념정리 2022. 4. 24. 22:25
    정적웹크롤링
    import requests
    from bs4 import BeautifulSoup
    import pandas as pd
    import matplotlib.pyplot as plt
    import matplotlib
    
    result = []
    #쿠우쿠우
    for pageNum in range(1,8):
        url = f'http://www.qooqoo.co.kr/bbs/board.php?bo_table=storeship&&page={pageNum}'
        response = requests.get(url)
    
        print('-------------------------- " ', pageNum)
    
        if response.status_code == 200:
            html = response.content
            soup = BeautifulSoup(html, 'html.parser',from_encoding='cp949')
    
            tbody = soup.find('tbody')
            tr_list=tbody.find_all('tr')
            for i in range(0,len(tr_list),2):
                tr=tr_list[i]
                loc = tr.find('span', class_="color-grey").text  # 지역
                name = tr.find('div', class_="td-subject ellipsis").find_all('a')[1].text  # 지점명
                tel = tr.find('td', class_="hidden-xs").find('a').text  # 주소
                addr = tr.find('td', class_="hidden-xs td-width").find('a').text  # 번호
                result.append([loc, name, addr, tel])
                print(loc, name, addr, tel)
    
        else :
            print(response.status_code)
    
    pr = pd.DataFrame(result, columns=['loc', 'name', 'addr', 'tel'])

     

    1. 문자열 치환 변경

    pr['loc']=pr['loc'].str.replace('[','')

     

    2. 지역별 데이터 뽑기, groupby 함수, value_counts() 사용

    a=pr['loc'].value_counts()
    b=pr.groupby('loc')
    b.describe()

    3. 경기도 열 삭제

    a.drop(['경기도'],inplace=True)

    4. 정렬 

    a.sort_values(ascending=True,inplace=True)

    5. 포함된 문자열 찾기

    a[a.index.str.contains('세종')]
    condition = sample['name'].isin(['kim', 'lee'])
    
    sample.loc[condition]

    6. column 이름 바꾸기 rename

     df.columns = ['a', 'b']
    pandas 예제
    import numpy as np
    import matplotlib.pyplot as plt
    from matplotlib import rc
    import matplotlib
    
    rc('font', family='AppleGothic')
    plt.rcParams['axes.unicode_minus'] = False
    sr = pd.Series( [90,90,55,60,76,80,76,88,30,25],
                   name="국어점수" )
    sr.index=['홍길동','이순신','임꺽정','정난정',
             '이이','이황','정도전','김철수1',
              '김철수2','김철수3']
    sr
    print(sr.max())
    print(sr.nlargest(1,keep="all").index)
    print(sr[(sr>=50)&(sr<=80)])
    print(sr[sr.index.str.contains('^김')])
    print(sr.mean())
    sr.drop(sr[sr<=40].index,inplace=True)
    #sr.apply(lambda v:v*1.1 if v>=50 else v*1.2)
    print(sr.sort_values(ascending=False).head())
    print(sr.nlargest())
    sr50=sr[sr>50]
    sr50.plot(kind='bar')
    ​
    #plt.plot()
    for i,v in sr.items():
        if v>70:
            print(i,v,'합격',sep='\t')
        else:
            print(i,v,'불합격',sep='\t')

     

    dataframe 예제

     

    data =  {'eng':[10,30,50,70],
             'kor':[20,40,60,80],
             'math':[90,50,20,70]}
    df = pd.DataFrame(data, index=['a','b','c','d'] )
    df

    1.인덱스 지정 iloc loc

    df['eng']['a':'c']
    df[1:3]
    df.iloc[1:3,[0,2]]
    df.loc['b':'c',['eng','math']]
    condition1 = (df['age'] >= 20) & (df['age'] < 40)
    condition2 = (df['pclass'] < 3)
    df.loc[condition1 & condition2, ['survived', 'age']].head(10)

    2.열끼리 합쳐서 새로운 열(컬럼) 만들기 : 열추가

    #열추가
    df['new']=[1,2,3,4]
    df['new2']=df['eng']+df['kor']
    df

    3. 값 더하기

    df.loc['b':'c','kor':]=df.loc['b':'c','kor':]+2
    df

    4. 조건값 가져오기

    df[(df['eng']>20) & (df['kor']>60)]
    menuDF[menuDF['업종']=='한식']
    menuDF[menuDF['상세주소'].str.contains('동래구')]
    yeo =kdf.loc['여주']
    yeo[ yeo['최저']<=-10 ]

    5. 행추가

    #행추가
    df.loc['e']=[1,2,3,4,5]
    df

    6. 행, 열 삭제

    #삭제
    df=df.drop(index=['a','c'])
    df=df.drop(columns=['kor'])

    7.nan 값 넣기

    #nan값 넣기
    df.loc['c':'d','kor':]=np.nan
    df.isna().sum()
    df

    8. nan값 채우기 fillna()

    #nan값 채우기 fillna
    df['math']=df['math'].fillna(3)
    df

    9. nan 삭제

    #nan삭제
    dfq=df.dropna(axis=1)
    df

    10. 열 기준 값 정렬

    df.sort_values(by="math",ascending=True)

    11. 특정 값 변경

    #값변경
    df.loc['c','math']=999
    df

    12. 평균, 표준편차, 갯수 - describe mean std count

    df.mean()
    df.std()
    df.count()
    df.describe()

    13. 열합계 axis=1 , 행합계 axis=0

    df['nw']=df[['eng','math']].sum(axis=1) 
    df
    pr1.loc['합계','dome']=pr1['dome'].sum(axis=0)
    pr1
    bb.loc['합계']=bb.sum(axis=0)
    bb

    14. 새로운 열 조건 만들기 apply

    df['결과']=df.apply(lambda v:'합격' if v.mean()>=70 else '불합격',axis=1)
    df

    15. 특정열만 뽑아서 표 만들기 합계까지 같이

    pd.crosstab(df['eng'],df['math'], margins=True)

    16. 상위 몇 개 뽑기 : nlargest

    df.nlargest(2,'eng')

    17. 특정열로 bar차트 그리기

    df.plot(kind='bar',y=['eng','kor'])

     

     

     

     

    18. 타입 확인 dtypes

    pr1.dtypes

    19. 쉼표 제거, 타입 변경 astype : 무엇을 변경할지 열을 지정해줘야함 

    pr1['dome']=pr1.dome.str.replace(',','').astype('int64')

    20. 인덱스 다시 복구

    pr1.reset_index()

    csv 파일 dataframe 예제
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import matplotlib
    from datetime import datetime 
    matplotlib.rcParams['font.family']='Malgun Gothic'
    matplotlib.rcParams['axes.unicode_minus'] = False
    data1 = pd.read_csv('2014졸음.csv',encoding='euc-kr') 
    data2 = pd.read_csv('2015졸음.csv',encoding='euc-kr') 
    data3 = pd.read_csv('2016졸음.csv',encoding='euc-kr')

     

    1. 데이터 합치기 concat

    data=pd.concat([data1,data2,data3])

    2. 특정열을 index 지정하기

    data.set_index('구분',inplace=True)

    3. 년도,월별로 index나누기

    ans2=data.copy()
    ans2.index=pd.to_datetime(ans2.index,format='%Y년%m월')
    ans2.set_index([ans2.index.year,ans2.index.month],inplace=True)
    ans2.index.names=['년도','월']
    ans2

    4. 년도별 사망자 평균

    y=ans2.groupby('년도').mean()[['사망(명)']]

    5.2016년 사건대비 사망자

    d_2016= (ans2.loc[2016,'사망(명)']).sum()/(ans2.loc[2016])['사고(건)'].sum()

    6. 2014 사망자,부상자 차트

    7. 2016사망자 - 2015사망자 차이

    (ans2.loc[2016,'사망(명)']-ans2.loc[2015,'사망(명)']).nlargest(1,keep='all')

     

Designed by Tistory.