develope_kkyu

[Python] pandas 예제 - 2 본문

Python

[Python] pandas 예제 - 2

developekkyu37 2023. 1. 4. 16:46
728x90

https://pandas.pydata.org/docs/user_guide/10min.html에 나와 있는 pandas 예제 코드를 살펴본다.

import pandas as pd
import numpy as np

선택

  • 가져오기
df["A"] # "A" 칼럼 값 가져오기
Out[]: 
2013-01-01    0.469112
2013-01-02    1.212112
2013-01-03   -0.861849
2013-01-04    0.721555
2013-01-05   -0.424972
2013-01-06   -0.673690
Freq: D, Name: A, dtype: float64
df[0:3] # 0번째 부터 2번째 행 가져오기
Out[]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804

df["20130102":"20130104"] # 인덱스 값이 20130102부터 20130104 값인 행 가져오기
Out[]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
  • 레이블에 의한 선택
df.loc[dates[0]] # 레이블을 사용하여 횡단면 가져오기
Out[]: 
A    0.469112
B   -0.282863
C   -1.509059
D   -1.135632
Name: 2013-01-01 00:00:00, dtype: float64
df.loc[:, ["A", "B"]] # 레이블로 여러 축 선택
Out[]: 
                   A         B
2013-01-01  0.469112 -0.282863
2013-01-02  1.212112 -0.173215
2013-01-03 -0.861849 -2.104569
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020
2013-01-06 -0.673690  0.113648
df.loc["20130102", ["A", "B"]] # 레이블 슬라이싱
Out[]: 
A    1.212112
B   -0.173215
Name: 2013-01-02 00:00:00, dtype: float64

df.loc[dates[0], "A"]
Out[]: 0.4691122999071863
df.loc[dates[0], "A"] # "A" 인덱스 첫번째 값
Out[]: 0.4691122999071863

df.at[dates[0], "A"] # 더 빠른 액세스
Out[]: 0.4691122999071863
  • 위치에 의한 선택
df.iloc[3] # 정수의 위치를 통해 선택
Out[]: 
A    0.721555
B   -0.706771
C   -1.039575
D    0.271860
Name: 2013-01-04 00:00:00, dtype: float64
df.iloc[3:5, 0:2] # 슬라이싱
Out[]: 
                   A         B
2013-01-04  0.721555 -0.706771
2013-01-05 -0.424972  0.567020
df.iloc[[1, 2, 4], [0, 2]] # numpy스타일
Out[]: 
                   A         C
2013-01-02  1.212112  0.119209
2013-01-03 -0.861849 -0.494929
2013-01-05 -0.424972  0.276232
df.iloc[1:3, :] # 명시적인 행 슬라이싱
Out[]: 
                   A         B         C         D
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804
df.iloc[:, 1:3] # 명시적인 칼럼 슬라이싱
Out[]: 
                   B         C
2013-01-01 -0.282863 -1.509059
2013-01-02 -0.173215  0.119209
2013-01-03 -2.104569 -0.494929
2013-01-04 -0.706771 -1.039575
2013-01-05  0.567020  0.276232
2013-01-06  0.113648 -1.478427
df.iloc[1, 1] # 명시적인 값 얻기
Out[]: -0.17321464905330858

df.iat[1, 1] # 더 빠른 액세스
Out[]: -0.17321464905330858
  • Boolean indexing
df[df["A"] > 0] # 조건절 - "A"가 0보다 큰 테이블 가져오기
Out[]: 
                   A         B         C         D
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632
2013-01-02  1.212112 -0.173215  0.119209 -1.044236
2013-01-04  0.721555 -0.706771 -1.039575  0.271860
df[df > 0] # 0보다 큰 데이터만 나타내기
Out[]: 
                   A         B         C         D
2013-01-01  0.469112       NaN       NaN       NaN
2013-01-02  1.212112       NaN  0.119209       NaN
2013-01-03       NaN       NaN       NaN  1.071804
2013-01-04  0.721555       NaN       NaN  0.271860
2013-01-05       NaN  0.567020  0.276232       NaN
2013-01-06       NaN  0.113648       NaN  0.524988
df2 = df.copy() # 테이블 복사

df2["E"] = ["one", "one", "two", "three", "four", "three"] # 새로운 칼럼 추가

df2
Out[]: 
                   A         B         C         D      E
2013-01-01  0.469112 -0.282863 -1.509059 -1.135632    one
2013-01-02  1.212112 -0.173215  0.119209 -1.044236    one
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804    two
2013-01-04  0.721555 -0.706771 -1.039575  0.271860  three
2013-01-05 -0.424972  0.567020  0.276232 -1.087401   four
2013-01-06 -0.673690  0.113648 -1.478427  0.524988  three

df2[df2["E"].isin(["two", "four"])] # 필터링 
Out[]: 
                   A         B         C         D     E
2013-01-03 -0.861849 -2.104569 -0.494929  1.071804   two
2013-01-05 -0.424972  0.567020  0.276232 -1.087401  four
  • Setting(설정)
s1 = pd.Series([1, 2, 3, 4, 5, 6], index=pd.date_range("20130102", periods=6))

s1
Out[]: 
2013-01-02    1
2013-01-03    2
2013-01-04    3
2013-01-05    4
2013-01-06    5
2013-01-07    6
Freq: D, dtype: int64

df["F"] = s1 # 시리즈를 칼럼으로 추가
df.at[dates[0], "A"] = 0 # A의 인덱스 0번째 값에 0을 대입
df.iat[0, 1] = 0 # 인덱스0이고 1번째 칼럼("B") 값에 0을 대입
print(np.array([5] * len(df)))
df.loc[:, "D"] = np.array([5] * len(df)) # 데이터프레임 길이만큼 값이 5인 행렬을 "D"칼럼에 할당

df
Out[]: 
                   A         B         C  D    F
2013-01-01  0.000000  0.000000 -1.509059  5  NaN
2013-01-02  1.212112 -0.173215  0.119209  5  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5  2.0
2013-01-04  0.721555 -0.706771 -1.039575  5  3.0
2013-01-05 -0.424972  0.567020  0.276232  5  4.0
2013-01-06 -0.673690  0.113648 -1.478427  5  5.0
df2 = df.copy()

df2[df2 > 0] = -df2 # 0보다 큰 df2 데이터프레임 값들을 음수화

df2
Out[]: 
                   A         B         C  D    F
2013-01-01  0.000000  0.000000 -1.509059 -5  NaN
2013-01-02 -1.212112 -0.173215 -0.119209 -5 -1.0
2013-01-03 -0.861849 -2.104569 -0.494929 -5 -2.0
2013-01-04 -0.721555 -0.706771 -1.039575 -5 -3.0
2013-01-05 -0.424972 -0.567020 -0.276232 -5 -4.0
2013-01-06 -0.673690 -0.113648 -1.478427 -5 -5.0

결측값

pandas는 np.nan을 사용하여 결측값을 나타낸다. Reindexing을 통해 axis의 인덱스를 변경/추가/삭제할 수 있다.

df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ["E"]) 
# 인덱스는 df의 0번째부터 3번째까지이고 df의 칼럼과 "E"를 추가한 칼럼으로 이루어진 df1 만들기 

df1.loc[dates[0] : dates[1], "E"] = 1 # 0번째와 1번째 "E" 칼럼인 값은 1

df1
Out[]: 
                   A         B         C  D    F    E
2013-01-01  0.000000  0.000000 -1.509059  5  NaN  1.0
2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5  2.0  NaN
2013-01-04  0.721555 -0.706771 -1.039575  5  3.0  NaN
df1.dropna(how="any") # 결측값(NaN or None) 제거 , how="any"는 존재하면 제거
Out[]: 
                   A         B         C  D    F    E
2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0
df1.fillna(value=5) # 결측값을 5로 변경
Out[]: 
                   A         B         C  D    F    E
2013-01-01  0.000000  0.000000 -1.509059  5  5.0  1.0
2013-01-02  1.212112 -0.173215  0.119209  5  1.0  1.0
2013-01-03 -0.861849 -2.104569 -0.494929  5  2.0  5.0
2013-01-04  0.721555 -0.706771 -1.039575  5  3.0  5.0
pd.isna(df1) # 결측값 확인
Out[]: 
                A      B      C      D      F      E
2013-01-01  False  False  False  False   True  False
2013-01-02  False  False  False  False  False  False
2013-01-03  False  False  False  False  False   True
2013-01-04  False  False  False  False  False   True
728x90

'Python' 카테고리의 다른 글

[Python] pandas 예제 - 4  (0) 2023.01.05
[Python] pandas 예제 - 3  (0) 2023.01.05
[Python] pandas 예제 - 1  (1) 2022.12.30
[Python] 튜플(tuple)과 리스트(list) 비교  (0) 2022.12.26
[Python] str 메서드  (0) 2022.12.26