2019-03-10

Pandas를 쓰다가 찾게 된 것들

0. 엑셀 쓰면 되는거 아닌가? 왜 Pandas같은걸 쓰는거지?

싶다가..

강력한 파이썬의 기능들을 응용할 수 있다는 점, 내가 맘대로 데이터를 주무를 수 있다는 점 등등 때문에 결국 Pandas를 사용하게 되었다.

기본적인 사용법들이라면 적지 않아도 될 것만 같다. 개인적으로 공부하기 위해 남겨두는 글이기도 하거니와, 누군가가 찾으려 하거든 이 게시물에서 얻어갈 수 있다면 참 좋겠다는 생각으로 공개해둡니다. 열공하세요.



1. print(df) 에서 ...으로 생략되는거 없애고 전부 출력하기.

(문제는 생략됨에 있었다)

실은 저 사이에 column name에 'name'이나 'category'등이 들어가야 할 판이다. 근데 전부 생략되어버렸다. 이럴 땐 아래와 같은 간단한 옵션을 추가해서 바꿀 수 있다.

import pandas as pd

# 최대 줄 수 설정
pd.set_option('display.max_rows', 500)
# 최대 열 수 설정
pd.set_option('display.max_columns', 500)
# 표시할 가로의 길이
pd.set_option('display.width', 1000)

표시할 가로의 길이는 character의 개수로 나타내는 것 같다. 자세한 내용은 판다스 홈페이지에서 찾아볼 수 있다.

+추가:

이보다 편리한 방법이 있다.
pd.describe_option() 을 출력해보면 해당 DataFrame의 옵션을 모두 볼 수 있다.

(pd.describe_option()을 실행한 모습)

Column에 표시되는 내용 또한 '...'으로 생략되어버리는 경우가 있었기에 찾아보다가, 이런 내용이 있는 것을 발견했다. 이거 하나면 모든 설정을 할 수 있을 것만 같다!
옵션에 대한 현재값을 얻을 땐 pd.get_option()을 사용하고, 설정값을 넣을 땐 pd.set_option()을 사용하면 된다.


2. Column 정렬 순서 바꾸기

(이렇게 나온다.)

그런데 나는 A, C, B, D 순서로 만들고 싶다. 그렇다면 아래와 같이 새로운 인덱스로 정의해서 출력해버리면 된다.

(B와 C의 순서가 바뀌었다.)

개수가 적을 때에나 사용하기 좋은 방식 아닐까.. 나중에 알게 되면 추가할 것.



3. pd.read_csv('data.csv') 에서 UnicodeDecodeError: 'utf-8' codec can't decode bytes in position 1-2: invalid continuation byte 라고 에러가 뜬다.

간단하다.

with open('file_name.csv') as f:
    print(f)

불러온 객체를 그대로 print()

<_io .textiowrapper="" encoding="utf8" mode="r" name="file_name.csv">

와 같이 인코딩을 그대로 보여주는 경우들도 두루 있다.

그런데

간혹 인코딩이 보이지 않는 경우도 있다. 그럴 땐

from encodings.aliases import aliases
alias_values = set(aliases.values())

for encoding in set(aliases.values()):
    try:
        df=pd.read_csv("test.csv", encoding=encoding)
        print('successful', encoding)
    except:
        pass

위와 같이 인코딩 생략형들을 전부 불러와서

Exception이 생기지 않는 인코딩을 쓰면 된다.

필자의 경우엔

pd.read_csv('data.csv', encoding="ISO-8859-1")

위의 코드처럼 라틴 알파벳을 포함하는 csv파일을

ISO 규격으로 read해서 사용한 경험이 있다.



4. 인접한 row가 같은 값일 때에만 묶어서 더하기


위의 df는 user와 location이 동일하고, 서로 인접해 있을 때에만

duration을 합하고 싶다는 질문글이다.

이 정렬의 특징은

3번째 열과 5~6번째 열이 같은 'location', 같은 'user'임에도

서로 '인접(adjacent)'해있지 않아서

duration이 합해지지 않은 것이 핵심이다.

이 문제는 다음의 코드로 해결할 수 있다.

adj_check = (df.location != df.location.shift()).cumsum()
df.groupby(['user', 'location', adj_check], as_index=False, sort=False)['duration'].sum()


코드 해석 -

- 일단 sort=False로 지정하여 원본 DF의 순서가 정렬되어버리지 않도록 한다.

그런 다음 합산하고자 하는 'duration' column을 계산한다.


























댓글 없음:

댓글 쓰기