Python/Case 정리

[Python] 데이터프레임에 조건이 있는 반복문을 돌릴 때 꼼수

허니비 honeybee 2022. 12. 15. 19:28

파이썬으로 실제 데이터를 다룰 때는 데이터 프레임으로 작업해야 하는 경우가 많다 

필자는 학생 시절 리스트같은 자료형을 다루는 방법으로만 주로 연습해서 익숙하지 않은 데이터프레임에 여러가지 조건을 걸어서 반복문을 돌려야 할 때 막히는 경우가 많았음. 

 

데이터프레임 반복문을 사용하기 시작한거는 아직 세 달 미만인데 더 좋은 방법이 있다면 댓글로 공유바람!

 

 

이렇게 생긴 데이터로 실습해보겠다 

 

 

1. 단순 반복을 쓸 경우

 

-> df 전체를 돌리는 경우는 컬럼 이름만 출력됨 

-> 특정 시리즈를 선택해서 돌리는 경우는 값만 출력됨, 즉, 특정 행에 접근하기 어려움 & 두개 이상의 시리즈에 접근하기 어려움 

 

 

 

그러니 이 방법으로는 원하는 방법에는  접근하기 어렵다 (컬럼 여러개에 조건 달기 등)

 

 

2. items(), iterrows()

 

 

-> iteritems 를 쓰는 경우, 첫번째 변수는 컬럼명, 두 번째 변수는 값으로 나온다. 

-> iterrows 를 쓰는 경우, 첫 번째 변수는 인덱스, 두 번째 변수는 row 값 전체가 나온다 

 

 

for i, j in df.iteritems():
  print(i)
  print('-------')
  print(j)

for index, row in df.iterrows():
  print('------------')
  print(row)

 

 

3. 2번 변형 

 

-> 2번 방법을 차용해.. 한 시리즈에서만 포문을 돌리고 싶다면 그냥 df 부분에 시리즈명을 지정해주면 된다. \

-> row 를 반복하는 iterrows 는 시리즈로 못 돌린다 

 

for i, j in df['age'].iteritems():
  print(i)
  print('-------')
  print(j)

 

 

 

 

-> 혹은 여러가지 컬럼을 지정해 주고 싶은 경우는 zip 을 이용해 컬럼을 감싸주면 된다

 

 

 

for age, point in zip(df['age'], df['point']):
    print(age, point)

 

 

 


 

 

하지만 이 방법들을 복잡하게 쓴다면 (여기서 이제 조건을 걸고 이중 포문을 건다면) 매우매우 헷갈리기 시작할 것이다.. 그러다 찾은 좀 더 쉬운 방법은!!

 

 

필자 추천 ! 

조금 더 이지한 형식인 dict 를 이용하자..!

 

4. dict 역시 key 와 value 각각에 접근할때는 items 를 이용할 수 있다 

 

dict_sample ={}

for row, val in df['age'].items():
    if val: #공백이 아니면, 즉, 값이 존재한다면
        dict_sample[val] = df['state'][row] #이 구조로 dict 를 만들거야

위 코드를 이용해 원하는 데이터 조건을 뽑은 dict 를 일단 만들자. 

 

이런식으로 나올것이다 

dict_sample

#{24: 'NY', 42: 'CA'}

 

이 dict 를 이용해서 원하는 조건을 걸거나 새로운 시리즈를 형성할 수 있다

 

이 예시는 point 시리즈 값을 변수로 삼은 함수인데, 딕셔너리의 첫 번째 값보다 point 값이 작으면, 새로운 시리즈인 pt_2 에 smaller를 입력해주는 것이다. 

 

def how_much_point_do_you_have(pt) : #point 값들을 pt 변수로 취급
  for p,q in dict_sample.items(): #딕셔너리의 key 와 val 에 대해서
      if p < pt: #key 값이 pt 보다 작으면
        return 'smaller'
        
df['pt_2'] = df['point'].apply(how_much_point_do_you_have) #함수 적용

 

 

"조건을 걸어서 새로운 데이터프레임을 형성해 낼 때!" 유용하게 쓴 방법이다 

 

사실 이중 포문 쓰다 넘 헷갈려서 사용하기 시작한 방법인데,, 유용하게 쓰고 있다.. ㅎ 

나중에 같은 작업 하게 될 때 내가 참고하기 위해 글 써 봤음

728x90