중첩딕셔너리로 데이터프레임 만든 뒤 엑셀로 저장하면 생략된 정보가 있어요

조회수 1158회
fleet_list = {}

airlines = ['lj-jna', 'ke-kal', 'oz-aar', '7c-jja', 'bx-abl', 'tw-twb', 'rs-asv']

for i in airlines:
    driver.get('https://www.flightradar24.com/data/airlines/%s' % i)
    driver.find_element_by_css_selector('nav > a:nth-child(3)').click()
    driver.find_element_by_css_selector('#list-aircraft > dt:nth-child(2)').click()
    try:
        for i in range(4, 51, 2):
            driver.find_element_by_css_selector('#list-aircraft > dt:nth-child(%s)' % i).click()
    except:
        pass
    fleet = driver.find_elements_by_css_selector('td:nth-child(1) > a')
    airline_code = driver.find_element_by_css_selector('div.row.m-t-l.m-l-l > h2').text[3:]
    for j in fleet:
        if airline_code not in fleet_list:
           fleet_list[airline_code] = {}
        fleet_list[airline_code].setdefault(j.text)
        for i in fleet_list[airline_code].keys():
            fleet_list[airline_code][i] = []
    time.sleep(2)

for i in fleet_list['ASV'].keys():
    driver.get('https://www.flightradar24.com/data/aircraft/%s' % i)
    html = driver.page_source
    raw = pd.read_html(html)
    fleet_list['ASV'][i].append(raw[0])
    time.sleep(3)

asv_data = pd.DataFrame(fleet_list)
asv_data.to_csv('sample2.csv')   

현재 코드를 실행하면 fleet_list의 값이

{'ASV': {'HL7212': [                                       FLIGHTS HISTORY  ... Unnamed: 32
0    RS904 06 Oct 2020 0:50 Landed 03:22 STD 02:00A...  ...         NaN
1    RS903 06 Oct 2020 0:50 Landed 01:37 STD 00:15A...  ...         NaN
2    RS902 05 Oct 2020 0:49 Landed 23:49 STD 22:35A...  ...         NaN
3    RS901 05 Oct 2020 0:53 Landed 22:06 STD 21:00A...  ...         NaN
4    RS908 05 Oct 2020 0:48 Landed 11:40 STD 10:40A...  ...         NaN
..                                                 ...  ...         ...
96   RS906 22 Sep 2020 0:48 Landed 07:36 STD 06:25A...  ...         NaN
97   RS905 22 Sep 2020 0:55 Landed 05:29 STD 04:20A...  ...         NaN
98   RS904 22 Sep 2020 0:54 Landed 03:12 STD 02:00A...  ...         NaN
99   RS903 22 Sep 2020 0:51 Landed 01:15 STD 00:15A...  ...         NaN
100                                                NaN  ...         NaN
[101 rows x 33 columns]],
# 뒤는 생략

그리고 csv로 저장하면

https://res.cloudinary.com/eightcruz/image/upload/v1601955667/hdxfzlxixyyp1ws3cdxa.png

이렇게 나와요. ... 이게 생략된게 아니고 그냥 ...이 적힌거에요. 어떻게 해야 전부다 나오게 할 수 있을까요?

이미지가 안나와서 링크로 올립니다

1 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    저라면 이렇게 하겠어요.

    
    asv_list = []
    for i in fleet_list["ASV"].keys():
        driver.get("https://www.flightradar24.com/data/aircraft/%s" % i)
        html = driver.page_source
        raw = pd.read_html(html)
        # fleet_list["ASV"][i].append(raw[0])
        df = raw[0]
        df["key"] = i
        asv_list.append(df)
        time.sleep(3)
    
    asv_data = pd.concat(asv_list)
    asv_data.to_csv("sample2.csv")
    

    fleet_list 가 데이터프레임들의 리스트를 안쪽에 가지고 있는 중첩된 딕셔너리인데... 데이터프레임에 컬럼을 하나 추가하고, 같은 구조의 데이터프레임을 하나로 합쳐요 ( pd.concat ), 이렇게 하나의 커다란 데이터프레임을 만들어서 이걸 csv 로 저장합니다.

    해보면, 가져온 테이블이 구조가 달라지는 경우가 있는데, 이런 부분 잘 처리해서 버리던가... 하고요.


    stackoverflow 를 검색해 보니, 여러 시트로 나누어 저장하는 방법도 있는 것 같아요.

    https://stackoverflow.com/a/14225838/100093 : pandas 의 ExcelWriter 를 이용.

    • 답변 감사드립니다! 코드 실행해 보니 지금 사용하는 방식인데 그게 불편한 점이 있어서 새롭게 시도중이었습니다. 혹시 데이터프레임 맨 앞에 ASV와 fleet_list["ASV"].keys()에서 키를 하나씩 꺼내서 입력하고 데이터프레임을 넣을 수 있을까요? 지금 코드는 ASV 정보 긁어오는 것만 가져온건데 가져올게 ASV, KAL, JNA 등 6개가 더 있고 전체 코드를 돌리면 엑셀기준으로 3만 줄이 넘어가요 ㅠ 그래서 정보 긁어와서 저장할 때 제대로 하지 않으면 분류작업이 너무 힘듭니다 ㅠ 김지용 2020.10.7 01:27
    • @김지용 : 아래 써놓은 스택오버플로우 링크 보고 시트로 나누어서 저장해 보세요. / pandas to_csv 는 2차원 테이블형식의 데이터프레임이어야 저장이 잘 되요. 3, 4차원의 데이터는 저장하기 어렵습니다. 그래서, 차원을 줄이고, 키를 2차원테이블의 한 컬럼으로 집어넣은 거에요. / 이 데이터가 너무 크더라도, 사용할 때는, read_csv 로 읽어오고, groupby 로 나누어서 각각의 테이블을 분리할 수 있기 때문에, 이 방법을 제시해 드린 것입니다. / 더 좋은 방법은 ... 생각나지 않네요. nowp 2020.10.7 08:48
    • 친절한 설명 감사드립니다! 말씀하신 방법대로 한번 해볼게요!! 김지용 2020.10.7 14:28

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)