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을 계산한다.


























댓글 없음:

댓글 쓰기