pandas

beomjin_97·2023년 2월 25일
0

python

목록 보기
2/5

NumPy를 기반으로 설계된 구조화된 데이터를 처리하고 저장하는 라이브러리

Series

  • numpy array가 보강된 형태
  • data + index
import pandas as pd

# 기본형(0,1,2,...) 아닌 지정된 인덱스를 사용할 수도 있다.
# name 속성으로 title을 지정할 수도 있다.
data = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'] name='title1')

# 딕셔너리를 Series로 사용할 수 있다.
population_dict = {
'korea': 5180,
'japan': 12718,
'china': 141500,
'usa': 32676
}
population = pd.Series(population_dict)

연산

A = pd.Series([2, 4, 6], index=[0, 1, 2])
B = pd.Series([1, 3, 5], index=[1, 2, 3])
A + B
A.add(B, fill_value=0)

index에 맞춰서 연산된다.


DataFrame

  • 여러개의 Series가 모여서 행과 열을 이룬 데이터
population = pd.Series(population_dict)
gdp = pd.Series(gdp_dict)

country = pd.DataFrame({
	'population': population,
    'gdp': gdp

Series 간의 연산

gdp_per_capita = country['gdp'] / country['population’]
country['gdp per capita’] = gdp_per_capita

저장과 불러오기

# 저장
country.to_csv(./country.csv”)
country.to_excel(“country.xlsx”)

# 불러오기
country = pd.read_csv(./country.csv”)
country = pd.read_excel(“country.xlsx”)

인덱싱/슬라이싱

# 명시적 인덱스 참조
country.loc['china']  
country.loc['japan':'korea', :'population'] 

# 정수 인덱스 참조
country.iloc[0]
country.iloc[1:3, :2]

추가/수정

dataframe = pd.DataFrame(colums=['name', 'age', 'address']
dataframe.loc[0] = ['김범진', '27', '서울']
dataframe.loc[1] = ['name': '이혜영', 'age': '26', 'address': '제주']
dataframe.loc[1, '이름'] = '혜일'

#새로운 컬럼 추가
dataframe[‘contact'] = np.nan
dataframe.loc[0, ‘contact’] =01012341234

컬럼 선택

dataframe["name"]
dataframe[["name","address","age"]]

누락 데이터

dataframe.isnull()  # null인 값을 True로, null이 아닌 값을 False로 채워진 dataframe 반환

누락된 데이터가 있는 경우 해당 열을 삭제하거나, 빈곳을 default값으로 채우는 방식을 사용할 수 있다.

dataframe.dropna()
dataframe['contact'] = dataframe['contact'].fillna('no phone number')

연산

A = pd.DataFrame(np.random.randint(0, 10, (2, 2)), columns=list("AB"))
B = pd.DataFrame(np.random.randint(0, 10, (3, 3)), columns=list("BAC"))
A + B
A.add(B, fill_value=0)

index와 컬럼에 맞춰서 연산된다.

집계함수

data = {
'A': [ i+5 for i in range(3) ],
'B': [ i**2 for i in range(3) ]
}
df = pd.DataFrame(data)
df['A'].sum() # 18
df.sum()
df.mean()

정렬

df = pd.DataFrame({
'col1' : [2, 1, 9, 8, 7, 4],
'col2' : ['A', 'A', 'B', np.nan, 'D', 'C'],
'col3': [0, 1, 9, 4, 2, 3],
})
df.sort_values('col1', ascending=False) # 기본값은 오름차순 정렬
df.sort_values(['col2', 'col1'])  # col2에 대해서 정렬하고 동일한 값은 col1에 의해 정렬

조건 검색

masking 연산

df = pd.DataFrame(np.random.rand(5, 2), columns=["A", "B"])

df[“A”] < 0.5 # True, False값을 가지는 dataframe

df[(df["A"] < 0.5) & (df["B"] > 0.3)]
df.query("A < 0.5 and B > 0.3") # query를 이용해서도 조건 검색 가능

# 문자열 조건 검색
df["Animal"].str.contains("Cat")
df.Animal.str.match("Cat")

함수로 데이터 다루기

apply

apply를 통해서 함수로 데이터를 다룰 수 있다.

df = pd.DataFrame(np.arange(5), columns=["Num"])

df["Square"] = df.Num.apply(lambda x: x ** 2)

replace

df.Sex.replace({"Male": 0, "Female": 1}, inplace=True) 

그룹

groupby

df.groupby('key')
df.groupby('key').sum()
df.groupby(['key','data1']).sum()

그룹으로 묶은 다음 집계함수를 사용할 수도 있다.

aggregate

df.groupby('key').aggregate(['min', np.median, max])
df.groupby('key').aggregate({'data1': 'min', 'data2': np.sum})

aggregate를 사용하면 집계를 한번에 계산할 수 있다.

filter

def filter_by_mean(x):
return x['data2'].mean() > 3

df.groupby('key').filter(filter_by_mean)

그룹 속성을 기준으로 데이터 필터링을 사용할 수 있다.

apply

df.groupby('key').apply(lambda x: x.max() - x.min())

그룹을 통해 묶인 데이터에 함수를 적용할 수 있다.

get_group

df.groupby('시도').get_group('경기')

그룹으로 묶인 데이터에서 키값으로 데이터를 추출할 수 있다.

multiindex

df = pd.DataFrame(
np.random.randn(4, 2),
index=[['A', 'A', 'B', 'B'], [1, 2, 1, 2]], # 계층적 인덱스
columns=['data1', 'data2']
)

df = pd.DataFrame(
np.random.randn(4, 4),
columns=[["A", "A", "B", "B"], ["1", "2", "1", "2"]] # 계층적 열 인덱스
)

pivot_table

필요한 자료만 뽑아서 새롭게 요약

  • index: 행 인덱스로 들어갈 key
  • columns: 열 인덱스로 라벨링될 값
  • value: 분석할 데이터
df.pivot_table(
index="월별", columns='내역', values=["수입", '지출'])
profile
Rather be dead than cool.

0개의 댓글