구조화된 데이터의 처리를 지원하는 python 라이브러리로 numpy와 통합하여 강력한 스프레드시트 처리 기능을 제공한다. 그래서 데이터 처리 및 통계 분석을 위해 많이 사용되고 있다.

.png)
dates = pd.date_range('20130101', periods=6)
"""
DatetimeIndex(['2013-01-01', '2013-01-02', '2013-01-03', '2013-01-04',
'2013-01-05', '2013-01-06'],
dtype='datetime64[ns]', freq='D')
"""
.png)
import pandas as pd
#### 리스트로 Series 생성
list_data=[1,2,3,np.nan,5]
series_obj=pd.Series(data=list_data)
"""
0 1
1 2
2 3
3 NaN
4 5
dtype: int64
"""
series_obj.index # RangeIndex(start=0, stop=5, step=1)
series_obj.values # array([1, 2, 3, 4, 5])
#### dict로 Series 생성
dict_data={'a':1,'b':2,'c':3,'d':4,'e':5}
series_obj=pd.Series(dict_data, dtype=np.float32, name='example_data')
"""
a 1.0
b 2.0
c 3.0
d 4.0
e 5.0
Name: example_data, dtype: float32
"""
#### boolean index 활용
condition=series_obj>2
series_obj[condition]
"""
c 3.0
d 4.0
e 5.0
Name: example_data, dtype: float32
"""
#### index 값을 기준으로 series 생성하기 / 해당 인덱스 값이 없을 시 NaN
dict_data1={'a':1,'b':2,'c':3,'d':4,'e':5}
indices={'a','b','c','d','e','f','g','h'}
series_obj1=pd.Series(dict_data1,index=indices)
"""
h NaN
e 5.0
c 3.0
d 4.0
f NaN
b 2.0
a 1.0
g NaN
dtype: float64
"""
.png)
df = pd.DataFrame(np.random.randn(6,4), index=dates, columns=list('ABCD'))

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

raw_data = {
"first_name": ["Jason", "Molly", "Tina", "Jake", "Amy"],
"last_name": ["Miller", "Jacobson", "Ali", "Milner", "Cooze"],
"age": [42, 52, 36, 24, 73],
"city": ["San Francisco", "Baltimore", "Miami", "Douglas", "Boston"],
}
df = pd.DataFrame(raw_data,index=list('abcde'))

# column 하나(debt) 늘리기 + 비어있는 데이터는 NaN으로 생성
df=pd.DataFrame(raw_data,index=list('abcde'),columns=["first_name", "last_name", "age", "city",'debt'])

데이터프레임의 가장 윗 줄과 마지막 줄을 확인하고 싶을 때에 사용하는 방법은 다음과 같습니다.
df.head() : 시작에서 마지막 까지 불러옴df.tail() : 끝에서 시작까지 불러옴df 세부 정보 가져오기
df.index : 인덱스 array 출력df.columns : 컬럼 array 출력df.values : 표의 내부 자료 array 출력df.describe() : 데이터의 대략적인 통계적 정보 요약형태 바꾸기
df.T : 데이터를 전치합니다. ( column과 인덱스 가 서로 바뀌기)
df.sort_index(axis=1, ascending=False) : 축별로 정렬하기
df.sort_values(by="B") : 값 별로 정렬
#### bracket indexing - column 이름
df.first_name # df['first_name']
"""
a Jason
b Molly
c Tina
d Jake
e Amy
Name: first_name, dtype: object
"""
#### bracket indexing : index 위치
df[:2]
"""
first_name last_name age city debt
a Jason Miller 42 San Francisco NaN
b Molly Jacobson 52 Baltimore NaN
"""
#### bracket indexing : index 이름을 통해서 접근할시 기존의 리스트 인덱싱과 다르게 마지막 인덱스를 포함
df['a':'c']
"""
first_name last_name age city debt
a Jason Miller 42 San Francisco NaN
b Molly Jacobson 52 Baltimore NaN
c Tina Ali 36 Miami NaN
"""
#### loc 이용 - 인덱스 이름을 통해서 접근할시 기존의 리스트 인덱싱과 다르게 마지막 인덱스를 포함한다
df.loc['a':'c']
"""
first_name last_name age city debt
a Jason Miller 42 San Francisco NaN
b Molly Jacobson 52 Baltimore NaN
c Tina Ali 36 Miami NaN
"""
#### 다중리스트처럼 이용하기
df.loc[:,['last_name']]
"""
last_name
a Miller
b Jacobson
c Ali
d Milner
e Cooze
"""
#### iloc 이용
df.iloc[:3] #df[:3]
"""
first_name last_name age city debt
a Jason Miller 42 San Francisco NaN
b Molly Jacobson 52 Baltimore NaN
c Tina Ali 36 Miami NaN
"""
df['last_name'].iloc[:2] #Series , df['last_name'][:2]
"""
a Miller
b Jacobson
Name: last_name, dtype: object
"""
#### at 이용
# 지정된 행 / 열 쌍에서 값 가져 오기 -> 같은 방식으로 값설정도 가능함
df.at['b','age'] # b 행의 age열 값을 가져와라
# 52
# 시리즈 내에서 값 얻기
df.loc['b'].at['age']
# 52
#### Boolean Indexing
#### 나이 40 이상만 가져오기
df[df.age > 40]
"""
first_name last_name age city debt
a Jason Miller 42 San Francisco NaN
b Molly Jacobson 52 Baltimore NaN
e Amy Cooze 73 Boston NaN
"""
####Column에 새로운 데이터 할당
df.debt=df.age>40 # debt에 해당 인덱스의 age 컬럼값이 40 초과면 True / 40 이하면 False 넣기
"""
first_name last_name age city debt
a Jason Miller 42 San Francisco True
b Molly Jacobson 52 Baltimore True
c Tina Ali 36 Miami False
d Jake Milner 24 Douglas False
e Amy Cooze 73 Boston True
"""
del df['열이름'] # 해당 column 삭제
inplace=True 옵션 사용df
"""
first_name last_name age city
a Jason Miller 42 San Francisco
b Molly Jacobson 52 Baltimore
c Tina Ali 36 Miami
d Jake Milner 24 Douglas
e Amy Cooze 73 Boston
"""
# index 이름으로 drop
df.drop('a')
# 1개 이상의 index 이름으로 drop
df.drop(['a','b'])
"""
first_name last_name age city
c Tina Ali 36 Miami
d Jake Milner 24 Douglas
e Amy Cooze 73 Boston
"""
# 1개 이상의 column 으로 drop
df.drop(['first_name','last_name'],axis=1)
"""
age city
a 42 San Francisco
b 52 Baltimore
c 36 Miami
d 24 Douglas
e 73 Boston
"""
inplace=True 옵션을 사용한다.#### 원본
s1=pd.Series(np.arange(10))
"""
0 0
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
dtype: int64
"""
#### map, 함수를 인자로 적용
s1.map(lambda x:x**2)
"""
0 0
1 1
2 4
3 9
4 16
5 25
6 36
7 49
8 64
9 81
dtype: int64
"""
#### map , 인자로 함수 이외 dict, sequence형 자료등으로 대체 가능
z={1:'A',2:'B'}
s1.map(z) # dict type으로 데이터 교체 , 없는값은 NaN'
"""
0 NaN
1 A
2 B
3 NaN
4 NaN
5 NaN
6 NaN
7 NaN
8 NaN
9 NaN
dtype: object
"""
#### map, 인자로 series 넣기
s2=pd.Series(np.arange(11,20))
s1.map(s2) # 같은 위치의 데이터를 s2로 변환, 순서대로 변환하며 겹치지 않는 경우는 NaN
#### 한 행을 map으로 처리 후 바꿔주기
df['sex']=df.sex.map({'male':0,'female':1}) # sex 컬럼의 male, female을 0과1로 바꾸고 원본함수에 덮어씌우기

# example - replace
df.race.replace(df['race'].unique(),['w','o','h','b'],inplace=True) # target list -> conversion list
# df 의 race 컬럼을 변경 - df의 race컬럼의 unique 한 리스트와 ['w','o','h','b'] 을 매칭시켜 변경

# example - apply
f=lambda x:-x # 음수로
df_info=df[['earn','height']]
df_info.apply(f) # 각 column 별로 결과값 반환 - f가 음수로 변환하는거
## 예시x
# 내장 연산함수를 사용할때도 똑같은 효과를 거둘수 있다.
df_info.apply(sum) # df_info.sum()
# scalar 값 이외에 series 값의 반환도 가능하다.
def f(x):
return pd.Series([x.min(),x.max()],index=['min','max'])
df_info.apply(f)


# example - applymap
f=lambda x :-x
df_info.applymap(f)


# break it into pieces
pd.concat([df[:3], df[3:7], df[7:]]) # 원본과 동일하게 나옴


그룹화는 다음 단계 중 하나 이상을 포함하는 과정을 가리킵니다.

isin()
to_csv()df.to_csv()
# ,first_name,last_name,age,city,debt\na,Jason,Miller,42,San Francisco,True\nb,Molly,Jacobson,52,Baltimore,True\nc,Tina,Ali,36,Miami,False\nd,Jake,Milner,24,Douglas,False\ne,Amy,Cooze,73,Boston,True\n
SQL groupby 명령어와 동일
split - apply - combine 과정을 거쳐 연산
# groupby(묶음의 기준 컬럼)[적용받는 컬럼].적용받는 연산
df.groupby("Team")["Points"].sum()
aggregation: 요약된 통계정보 추출 ex. sum, mean
transformation: 해당 정보 변환 ex. lambda
filtration: 특정 정보 제거 (필터링)
grouped.agg(sum)
grouped.agg(np.mean)
# normalize
score = lambda x: (x - x.mean()) / x.std()
grouped.transform(socore)
df.groupby("Team").filter(lambda x: x["Points"].max() > 700)
index 축은 groupby와 동일
column에 추가로 labeling 값 추가
value에 numeric type 값을 aggregation
# 값: duration
df.pivot_table([duration],
index=[df.month, df.item],
columns=df.network,
aggfunc="sum",
fill_value=0)
pd.merge(df_a, df_b, on='subject_id')
# pd.merge(df_a, df_b, left_on='subject_id', right_on='id', how='right')
# join: inner, left, right, full
pd.concat([df_a, df_b])
db 연결 conn을 사용해 dataframe 생성
import sqlite3
conn = sqlite3.connet('./data.db')
cur = conn.cursor()
cur.execute('select * from airlines limit 5;')
res = cur.fetchall()
# tuple 형태로 나옴
df_airlines = pd.read_sql_query('select * from airlines;', conn)
XLS
openpyxls, XlsxWrite
writer = pd.ExcelWriter('./df_routes.xlsx', engine='xlswriter')
df_routes.to_excel(writer, sheet_name='Sheet1')
df_routes.to_pickle('./df_routes.pickle')
https://github.com/corazzon/cracking-the-pandas-cheat-sheet