시리즈, 데이터프레임.
Pandas는 Python에서 사용되는 데이터 분석 라이브러리입니다. Numpy와 함께 사용되며, 데이터를 빠르게 처리하고, 다양한 방법으로 조작할 수 있습니다.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
s = pd.Series([1,3,5,np.nan,6,8])
s
→ datetime 인덱스와 레이블이 있는 열을 가지고 있는 numpy 배열을 전달하여 데이터프레임을 만듦.
dates = pd.date_range('20130101', periods = 6)
dates
dates = pd.date_range('20130101', periods = 8)
dates
df = pd.DataFrame(np.random.randn(8, 4), index = dates, columns=list('ABCD'))
df

→ Series와 같은 것으로 변환될 수 있는 객체들의 dict로 구성된 데이터프레임을 만듦.
df2 = pd.DataFrame({'A' : 1.,
'B' : pd.Timestamp('2 'D' : np.array([3] * 4, dtype = 'int32'),
'E' : pd.Categorical(['test', 'train', 'test', 'train']),
'F' : 'foo'})
df2

df2.dtypes

df.tail(3) # 끝에서 마지막 3줄을 불러옴.
df.tail() # 끝에서 마지막 5줄 불러옴.

df.head()
df.head(3)

→ 인덱스, 열, numpy 데이터에 대한 세부정보를 볼 수 있음.
df.index

df.columns

df.values

df.describe()

df.T # 전치 행렬. -> 열과 행을 바꾸는 함수.

df.sort_index(axis = 1, ascending=False)

df.sort_values(by = 'B')
# ascending = False - 내림차순.(큰값 -> 작은값)
# ascending = True - 오름차순.(작은값 -> 큰값)

df['A']
→ 단일 열을 선택 함.

df[0:3]

df['20130102':'20130104']

df.loc[dates[0]]
# loc, iloc 데이터 접근 하는 함수.

df.loc[:,['A','B']]

df.loc['20130102':'20130104', ['A', 'B']]

df.loc[dates[0], 'A']

df.iloc[3]

df.iloc[3:5, 0:2]

df.iloc[[1,2,4], [0,2]]

df.iloc[1:3, :]

df.iloc[:,1:3]

df.iloc[1,1]

df[df.A > 0]

→ 데이터를 선택하기 위해 단일 열의 값을 사용.
df[df > 0]

📌 필터링을 위한 메소드 isin()을 사용.
df2 = df.copy()
df2['E'] = ['one', 'one', 'two', 'three', 'four',
'three', 'Three', 'four']
df2

df2[df2['E'].isin(['two','four'])]
# categorical

s1 = pd.Series([1,2,3,4,5,6,7,8], index=pd.date_range('20130102', periods=8))
s1

df['F'] = s1
df

→ 라벨에 의해 값을 설정.
df.loc[dates[0],'A'] = 0
위치에 의해 값을 설정.
df.iloc[0,1] = 0
→ Numpy 배열을 사용한 할당에 의해 값을 설정.
df.loc[:,'D'] = np.array([5] * len(df))
위 설정대로 작동한 결과.

→ where 연산을 설정.
df2 = df.copy()
df2[df2 > 0] = -df2
df2

→ Pandas는 결측치를 표현하기 위해 주로 np.nan 값을 사용. Reindexing으로 지정된 축 상의 인덱스를 변경 / 추가 / 삭제.
df1 = df.reindex(index=dates[0:4], columns=list(df.columns) + ['E'])
df1.loc[dates[0]:dates[3],'E'] = 1
df1

→ 결측치를 채워 넣음.
df1.dropna(how = 'any')

→ 결측치를 채워 넣음.
df1.fillna(value=5)

pd.isna(df1)

df.mean()

df.mean(1)

s = pd.Series([1,3,5,np.nan,6,8,9,10], index=dates).shift(2)
s

df.sub(s, axis='index')

→ 인덱스 기준, 각 데이터가 계산되어 짐.
df.apply(np.cumsum) # 누적합 구하기.

df.apply(lambda x: x.max() - x.min())

파이썬에서는 람다함수를 통해 이름이 없는 함수를 만들 수 있음.
람다함수의 장점은 코드의 간결함 메모리의 절약이라고 생각할 수 있음.
def my_func():

lambda x : x + 1
(lambda x : x+1)(3)
def hap(x, y):
return x + y
hap(10, 20)
(lambda x,y: x + y)(10, 20)
map(함수, 리스트).
이 함수는 함수와 리스트를 인자로 받음. 리스트로부터 원소를 하나씩 꺼내서 함수를 적용시킨 다음, 그 결과를 새로운 리스트에 담아줌.
list(map(lambda x: x ** 2, range(5)))
reduce(함수, 시퀀스)
from functools import reduce
reduce(lambda x, y: x + y, [0,1,2,3,4])
→ 예제는 먼저 0, 1을 더하고, 그 결과에 2를 더하고, 거기다가 3을 더하고, 또 4를 더한 값을 출력
filter(함수, 리스트)
list(filter(lambda x: x < 5, range(10)))
list(filter(lambda x: x % 2 == 0, range(10)))
list(filter(lambda x: x % 2 == 1, range(10)))
s = pd.Series(np.random.randint(0, 7, size=10))
s

s.value_counts()

s = pd.Series(['A', 'B', 'C', 'Aaba', 'Baca', np.nan, 'CABA', 'dog', 'cat'])
s.str.lower() # 소문자로 변경.
s.str.upper() # 대문자로 변경.

``결합 (join) / 병합 (merge) 형태의 연산에 대한 인덱스, 관계 대수 기능을 위한 다양한 형태의 논리를 포함한 Series, 데이터프레임, Panel 객체를 손쉽게 결합할 수 있도록 하는 다양한 기능을 pandas 에서 제공.
df = pd.DataFrame(np.random.randn(10, 4))
df

pieces = [df[:3], df[3:7], df[7:]]
pieces

pd.concat(pieces)

left = pd.DataFrame({'key': ['foo', 'foo'], 'lval': [1, 2]})
right = pd.DataFrame({'key': ['foo', 'foo'], 'rval': [4, 5]})
left

right

pd.merge(left, right, on= 'key')

df = pd.DataFrame(np.random.randn(8, 4), columns = list('ABCD'))

s = df.iloc[3]
df.append(s, ignore_index=True)

df = pd.DataFrame(
{
'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
'C' : np.random.randn(8),
'D' : np.random.randn(8)
})
df

생성된 데이터프레임을 그룹화한 후 각 그룹에 sum() 함수를 적용.
df.groupby('A').sum()
여러 열을 기준으로 그룹화하면 계층적 인덱스가 형성.
df.groupby(['A','B']).sum()