Pandas

Published by onesixx on

https://pandas.pydata.org/pandas-docs/stable/reference/io.html
https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf
https://pandas.pydata.org/pandas-docs/stable/user_guide/index.html

https://towardsdatascience.com/how-to-show-all-columns-rows-of-a-pandas-dataframe-c49d4507fcf

numpy 사용

import padas as pd
import os
import numpy as np
pd.set_option('display.max_rows', None)  # 모든 행 출력
pd.set_option('display.max_columns', None)  # 모든 열 출력
# Reset output options to default values
pd.reset_option('display.max_rows')
pd.reset_option('display.max_columns')

Series 의 집합

pandas unique values multiple columns

(df[['col1','col2']]).drop_duplicates()

옵션 목록 확인

pd.describe_option()

생략된 행 열 보이게

http://songhuiming.github.io/pages/2017/04/02/jupyter-and-pandas-display/

pd.set_option('display.max_colwidth', -1)
### 리스트 모두 보기 - Columns 리스트 전부 출력하기
pd.set_option('display.max_seq_items', None)
pd.set_option('display.max_columns', None)   # 20
pd.set_option('display.max_colwidth', 100)

df.head()
### DataFrame 생략 없이 출력하기

# row 생략 없이 출력
pd.set_option('display.max_rows', None)     # 60
# col 생략 없이 출력
pd.set_option('display.max_columns', None)

# pd.set_option('display.max_row', 500)
# pd.set_option('display.max_columns', 100)
### 한줄에 하나씩, 작은 숫자10으로 설정
pd.set_option('display.width', 10)
# pd.options.plotting.backend = "plotly"    # matplotlib

# Reset output options to default values
pd.reset_option('display.max_rows')
pd.reset_option('display.max_columns')

# Reset all options to default
pd.reset_option('all')

scientific notation

https://re-thought.com/how-to-suppress-scientific-notation-in-pandas/

pd.options.display.float_format = '{:.2f}'.format
pd.options.display.float_format = '{:.5f}'.format

pd.set_option('display.float_format', lambda x: '%.f'%x)
#pd.set_option('max_rows', None)
pd.set_option('max_rows',10)
df

df.head()

https://dandyrilla.github.io/2017-08-12/pandas-10min/

pandas는 numpy를 사용하여 계산성능이 좋다

!conda list | grep pandas
#설치여부

Pandas 종류

  • (1차원) Series (column) <= list
  • (2차원) DataFrame
  • (3차원) Panel
col1 = pd.Series([1,2,3])
pd.DataFrame(data= dict(col1=col1))
import plotly.express as px
iris = px.data.iris()
iris.sum()
iris.mean()
iris.max()
(iris.iloc[:, 0:4]).idxmax()   
(iris.iloc[:, 0:4]).idxmin()

(iris.iloc[:, 0:4]).abs()

CRUD

Create

행기준으로 만들기

열기준으로 만들기

https://youtu.be/f7rJEQy9yd0

List에서 만들기

List의 List에서 만들기

dictionary의 List로 만들기

OrderedDict으로 만들기

import numpy as np
import pandas as pd

dfEmpty = pd.DataFrame(data=np.nan, index=[0,1,2], columns=['A','B'])
pd.DataFrame(data=None, index=None, columns=None, dtype=None, copy=False)
df = pd.DataFrame({'x':x,
                   'y':y})

df = pd.DataFrame(
    data ={
        "a" : [4, 5, 6],
        "b" : [7, 8, 9],
        "c" : [10, 11, 12] },
    index = [1, 2, 3]
)
df = pd.DataFrame(
    data =[
        ["a" , [4, 5, 6]],
        ["b" , [7, 8, 9]],
        ["c" , [10, 11, 12]]  ],
    index = [1, 2, 3]
)
df = pd.DataFrame( 
    data=np.array([
        [4, 7, 10],
        [5, 8, 11],
        [6, 9, 12]  ],),
    columns= ['a','b','c'],
    index  = [1,2,3]
)
myList = [
    dict(name='John', age=25, job='student'),
    dict(name='Nate', age=30, job='teacher')
]
pd.DataFrame(myList) 

myDict = dict(
    name=['John', 'Nate'],
    age=[25,30],
    job=['student', 'teacher']
)
pd.DataFrame(myDict)

alter table

# Use `rename()` to rename your columns
newcols = {'A':'a', 'B':'b', 'C':'c'}
df.rename(columns=newcols, inplace=True)

# Rename your index
df.rename(index={1:'a'})

# 특정값 변경
df.replace('R2B', 'middle')

Update & Insert

df['D'] = ["R1D", "R2D", "R3D"]
df['D'] ="DD"

Delete

axis=0 (index) 함수가 열단위로 적용되어 각 열의 모든 행에 대해서 동작합니다. 결과는 행으로

  • drop 각 열의 행 값들을 지운다
  • mean 각 열의 행 값들의 평균을 구한다.

axis=1 (columns) 함수가 행단위로 적용되어 각 행의 모든 열에 대해서 동작합니다. 결과는 열로

  • drop 각 행의 열 값들을 지운다
  • mean 각 행의 열 값들의 평균을 구한다.
df.drop(['col1', 'col2'], axis=1, inplace=True)

dd = dd.drop_duplicates()

중복 행 제거

https://onesixx.com/pandas-slicing/

에러 경고

SettingWithCopyWarning

SettingWithCopyWarning: A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

https://emilkwak.github.io/pandas-dataframe-settingwithcopywarning

Pandas DataFrame은 연쇄적인(chained) 연산과 처리를 허용합니다.
SQL에서 테이블을 SELECT한 결과가 다시 테이블이 되어 다시 SELECT할 수 있는 것과 유사
RDBMS의 closure에 해당하는 개념

한편 DataFrame도 자료구조(data structure)인 셈이므로 이를 표현하기 위해 메모리를 점유합니다.
등장하는 모든 DataFrame에 메모리를 할당하려 들면 금방 바닥을 보이게 되겠지요.
Pandas에서는 원천 DataFrame을 생성할 때만 메모리를 할당하고 이로부터 파생되는 DataFrame은 원천 DataFrame을 이미 적재된 메모리에 접근케 하며 이로 인해 메모리를 절약합니다.
원천 DataFrame의 부분집합(subset)에 view를 형성한다 보면 됩니다.

파생된 DataFrame에 열(columns)을 하나 추가하면 어떻게 될까요?
한 DataFrame의 부분집합으로 이뤄진 view에 변경을 가하는 셈이지요.
원천 DataFrame에도 그 열을 붙여 줘야 할까요? 아니면 파생 DataFrame에만 붙이면 될까요?
원천 DataFrame에 그 열을 붙인다면, 파생 DataFrame에서 등장하지 않은 행(row)들에도 무언가를 붙여야 할까요, 말아야 할까요? 붙인다면 None으로 채워야 할까요?

이런 복잡한 질문에는 정답이 없습니다. 실제 개발하는 사람의 의도에 따라 원하는 바가 다를 수 밖에 없습니다. Pandas에서는 파생 DataFrame에 수정을 가하는 것을 권장하지 않습니다.(그래서 경고를 띄우는 것이죠.) 대신 Pandas는 copy() 메서드를 통해 파생 DataFrame에 독립적인 메모리를 부여한 뒤 여기에 수정을 가하도록 유도하지요. view를 실질화(materialization)시키는 것이죠.

요컨대 SettingWithCopyWarning의 발생을 예방하기 위한 가장 쉬운 방법은
파생 DataFrame에 copy() 메서드를 실행해, 원천 DataFrame과 별도인 메모리 공간을 파생 DataFrame에 부여하는 것입니다. 원천과 파생이 완전히 갈라서는 것이지요.
위에서 던졌던 복잡하고 귀찮은 질문들은 대답할 필요가 없게 되는 것이죠.

물론 이 경우 파생 DataFrame에 메모리가 부여되므로 사용 가능한 총 메모리는 줄어들게 됩니다.
이를 잘 감안해 사용해야 합니다.
copy()를 막 하다 보면 어느순간 메모리가 바닥나는 상황도 생길 수 있으니까요.

어쨌든 SettingWithCopyWarning은 의도치 않은 구현을 경고하는 중요한 장치입니다.
경고를 무시하고 개발해도 원하는 처리가 당장 된다고 해서 SettingWithCopyWarning을 무시하는 것보다는, SettingWithCopyWarning가 발생하지 않는 방식으로 개발하는 습관이 중요합니다.

dft['created_diff'] = dft['Created'].diff(periods=1)

dft2 = dft.copy()
dft2['created_diff'] = dft['Created'].diff(periods=1)

AAA

Categories: pandas

onesixx

Blog Owner

Subscribe
Notify of
guest

0 Comments
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x