중첩딕셔너리로 데이터프레임 만든 뒤 엑셀로 저장하면 생략된 정보가 있어요
조회수 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 답변
-
저라면 이렇게 하겠어요.
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
댓글 입력