(Python) 특정 조건으로 모든 행 업데이트하기
- apply 이용

판다스에서는 for문보다 apply를 애용합시다.

(python) 특정 조건으로 모든 행 업데이트하기 - apply 이용

1. 문제 발생



4개의 테이블로 구성된 데이터베이스가 있다.
각 테이블은 지역코드를 레코드로 가지고 있다.

그런데 2개의 테이블은 지역코드를 8자리의 형태로 가지고 있는 반면,
나머지 2개의 테이블은 지역코드를 10자리의 형태로 가지고 있다.

데이터를 살펴보니 10자리 형태의 지역코드는
8자리 지역코드에 “00”를 붙인 형태였다.

고민끝에 데이터 작업 편의를 위해 지역코드를 모두 10자리로 통일해주기로 했다.


전처리는 8자리 코드를 문자형으로 바꾼후 “00”을 첨부해주는 방식으로 진행하려 했다.
이를 위해 for문을 사용하였다.

for i in range(adstrd_master["adstrd_code"].count()):
	adstrd_master["adstrd_code"][i]=str(adstrd_master["adstrd_code"][i])+"00"
 

다행히 전처리가 필요한 첫번째 테이블은 다음과 같이 레코드 업데이트가 잘 되었다.

그리고 두번째 테이블을 전처리하기로 했다.
여기서 문제가 발생했다.

파일크기가 250kb로 크지 않았던 첫번째 테이블과 달리 두번째 테이블은 용량이 무려 2GB에 달하고 레코드수는 5000만개가 넘어가는 거대한 테이블이었다. for문을 이용하여 전처리를 진행하는데 몇 시간이 지나도 계속 “처리중”상태로 뜨는 것이었다.


아무리 용량이 크다고 해도 수 시간동안 레코드를 업데이트 하는 것은
이상하다는 생각이 들었다.

결국 for문을 이용한 방법이 문제가 있는 것 같아 다른 방식을 찾아보기로 했다.


2.해결 방법



pandas의 apply 메소드를 이용하면 간단히 해결 가능하다.

pandas 데이터프레임은 구조상 for문을 이용하여 데이터를 업데이트하면 시간이 상당히 오래 걸린다고 한다.

이럴경우 apply메소드를 통해 데이터를 빠르게 업데이트 할 수 있다.

fpopl['adstrd_code']=fpopl['adstrd_code'].apply(lambda x: str(x)+"00")


apply와 lambda를 활용하여 코드를 작성하면 된다.
apply는 lambda에 적용된 함수를 객체에 적용시켜주는 메소드이다.

놀랍게도 전처리 작업이 30초 안에 끝났다.
(for문으로는 3시간 넘어도 안되던 작업이…. 😅)


3. 배운 점 및 피드백



  • pandas 데이터프레임에서 for문 사용을 자제하자.
  • apply 메소드를 이용하면 레코드를 빠르게 업데이트 할 수 있다.
  • apply 메소드와 map 메소드의 차이를 알아보자.

새빨간 거짓말 통계 - 대럴 허프

새빨간 거짓말 통계

새빨간 거짓말 통계 - 대럴 허프


통계자료를 볼때 고려해야 할 점 (5가지)



1. 출처를 캐봐야 한다.


1) 조사자가 본인 측에 유리하도록 통계결과에 고의적인 왜곡을 하지않았는지

  • 직접 대놓고 거짓을 말함
  • 일부러 애매하게 표현
  • 유리한 데이터만 골라쓰고 불리한 데이터는 묵살

2) 무의식적으로 사용된 왜곡은 없는지?

  • 권위자가 인용되어있을 경우,
    그 권위자가 이야기와 관련되어 있을 뿐만 아니라 그 사실을 지지하고 있는지도 확인

2. 조사 방법이 올바른지 알아봐야 한다.

1) 올바른 표본을 사용하였는지

  • 표본의 수가 충분?
  • 표본의 추출 방법이 적당?

2) 같은 조건에서 실험(조사)을 진행했는지

3. 숨겨진 자료를 찾아 보아야 한다.

  • 신뢰도에 관한 자료 (유의수준, p-value, 표준편차)
  • 평균값의 종류 (산술평균?중앙값?)
  • 백분율만 있을 경우 실제 숫자
  • 비교할 수 있는 다른 자료 (비슷한 시기의 다른 조사, 그 시대의 주요 배경,사건)
  • 지수를 계산할때의 기준

4. 쟁점 바꿔치기에 주의해야 한다.

1) 상관관계를 인과관계처럼 해석해놓은 경우
2) 전후관계를 바꿔놓음
3) 피조사자들의 심리상태,태도가 반영된 조사결과

  • 중국의 두번의 인구조사
  • 1950년도, 미국의 인구조사 (사회보장제도 연금을 위한 조사)


5. 상식적으로 말이 되는 이야기인가 살펴보자.

  • 증명되지도 않는 가정을 토대로 장황하게 이야기가 전개될 때
    ‘상식적으로 말이 되는 이야기인가?’라는 질문 던져보자

  • 여러 통계들이 액면 그대로 받아들였다가는 큰일나는 거짓된 것들.

  • 너무나도 정확한 숫자 (소숫점까지 표현된 결과)
    • 자동차 연평균 과세액 : 51.13 달러
    • 직업 여성이 가족과 함께 만족한 생활을 하기 위해 필요한 주급 : 40.13 달러

(Python) XML 파일을 데이터프레임으로 만들기

XML 파일에 대해 알아보고 , 이를 데이터프레임으로 변환해보자.



(python) XML 파일을 데이터프레임으로 만들기



데이터 분석은 csv, xlsx, xml, json과 같은 다양한 형식(확장자)으로
저장된 데이터원본을 불러오는 일에서부터 시작된다.

이번 포스팅에서는 xml에 대해 알아보고
xml파일을 데이터프레임으로 변환하는 방법에 대해 다뤄볼 것이다.



1. XML이란?


1-1. XML의 정의

XML은 Extensible Markup Language의 약자로써 데이터 교환에 목적을 두고 만들어진 마크업 언어를 뜻한다.

여기서 마크업 언어란 태그 등을 이용하여 문서나 데이터의 구조를 나타내는 언어를 뜻한다.


1-2. XML의 특징(장점)

XML은 다양한 장점을 가지고 있다.

  • 많은 API가 개발되어 있다.
  • 텍스트 형식으로 데이터를 저장하여 직관적이다.
  • 유니코드를 사용하여 전세계 언어를 지원한다.
  • 특정 어플리케이션에 구애받지 않고 실행 가능하다.
  • 사전정의 태그가 없으며 태그를 자유롭게 지정할 수 있다.

특정 어플리케이션에 구애 받지않는다는 점과 사전 정의 태그가 없다는 점은 HTML과 구별되는 특징이다.
(HTML은 웹에서만 구현 가능 / 사전 태그 존재 )



2. XML을 판다스 데이터프레임으로 불러오기


( 그림 1. xml )


(그림2. 데이터프레임)

nameemailgradeage
Johnjohn@mail.comA16
Alicealice@mail.comB17
Bobbob@mail.comC16
Hannahhannah@mail.comA17


xml 파일을 판다스를 이용해 데이터프레임으로 변환해보자.
(그림 1 –> 그림 2)

이 작업을 위해 파이썬 모듈인 xml.etree.ElementTree 을 사용한다.

import xml.etree.ElementTree as et
xtree= et.parse("file_name.xml")
xroot= xtree.getroot()  


이 모듈은 xml파일의 데이터 구조를 트리(tree)구조로 바꿔준다.
각 칼럼의 레코드를 개별 노드에 저장하고 이 노드들을 데이터프레임에 넣어주는 것이다.

# xml to df 코드
  
import pandas as pd
import xml.etree.ElementTree as et
  
xtree=et.parse("students.xml")
xroot=xtree.getroot()
  
df_cols=["name","email","grade","age"]
row=[]
  
for node in xroot:
  s_name=node.attrib.get("name")
  s_mail=node.find("email").text if node is not None else None
  s_grade=node.find("grade").text if node is not None else None
  s_age=node.find("age").text if node is not None else None
  
  rows.append({"name":s_name, "email":s_mail,
               "grade":s_grade, "age" : s_age})
  
 out_df= pd.DataFrame(rows,colums=df_cols) 



name은 email,grade,age와 달리
node.attrib.get( )을 이용하여 구해줬다.

이는 name이 속성에 저장되어 있기 때문이다.
email,grade,age는 name 하위 구조로 존재한다.

이 세 변수는 node.find( ) 를 이용하여 구해주면 된다. ( 그림 1. xml 참고)

아래처럼 function으로 미리 만들어서 사용해도 된다.

import pandas as pd
import xml.etree.ElementTree as et
  
def parse_XML(xml_file,df_cols):  
    xtree=et.parse("students.xml")
    xroot=xtree.getroot()
    row=[]
  
    for node in xroot:
  	res=[]
   	res.append(node.attrib.get(df_cols[0]))
    	for el in f_cols[1:]:
   	  if node is not None and node.find(el) is not None:
     		res.append(node.find(el).text)
  	  else:
   		res.append(None)
        row.append({df_cols[i]:res[i] 
  		    for i,_ in enumerate(df_cols)})
  
    out_df=pd.DataFrame(rows,columns=df_cols)
    return out_df
  
    out_df= pd.DataFrame(rows,colums=df_cols) 
  
#   parse_XML( "students.xml", ["name","email","grade","age"])



✋🏾 참고링크 : https://medium.com/@robertopreste/from-xml-to-pandas-dataframes-9292980b1c1c

Pagination


© 2024. All rights reserved.