<jupyter_start><jupyter_text>Chapter 5===============================[[실행 코드]](https://github.com/alstn2468/Python_For_Machine_Learning/blob/master/Chapter.5/2.ipynb) Pandas- 구조화된 데이터의 처리를 지원하는 Python 라이브러리- Python계의 엑셀- Numpy와 통합하여, 강력한 스프레드시트 처리 기능 제공- 인덱싱, 연산용 함수, 전처리 함수 등을 제공  데이터 로딩<jupyter_code>import pandas as pd
data_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/housing/housing.data'
df_data = pd.read_csv(data_url, sep='\s+', header = None)
df_data.head()
df_data.columns = [
    'CRIM','ZN', 'INDUS', 'CHAS', 'NOX', 'RM', 'AGE', 'DIS', 'RAD', 'TAX', 'PTRATIO' ,'B', 'LSTAT', 'MEDV'] 
df_data.head()
type(df_data.values)<jupyter_output><empty_output><jupyter_text>Pandas의 구성- Series : DataFrame 중 하나의 Column에 해당하는 데이터의 모음 Object- DataFrame : Data Table 전체를 포함하는 Object<jupyter_code>from pandas import Series, DataFrame
import pandas as pd
example_obj = Series()
list_data = [1, 2, 3, 4, 5]
example_obj = Series(data = list_data)
example_obj<jupyter_output><empty_output><jupyter_text>Series- Subclass of numpy.array- Data : any type- Index labels need not be orderd- Duplicates are possible(but result in reduced functionality) index 이름 지정<jupyter_code>list_data = [1, 2, 3, 4, 5]
list_name = ['a', 'b', 'c', 'd', 'e']
example_obj = Series(data = list_data, index = list_name)
example_obj
import numpy as np

dict_data = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
example_obj = Series(dict_data, dtype = np.float32, name = 'example_data')
example_obj<jupyter_output><empty_output><jupyter_text>data index에 접근하기<jupyter_code>example_obj['a']<jupyter_output><empty_output><jupyter_text>data index에 값 할당하기<jupyter_code>example_obj['a'] = 3.2
example_obj<jupyter_output><empty_output><jupyter_text>값 리스트만 가져오기<jupyter_code>example_obj.values<jupyter_output><empty_output><jupyter_text>index 리스트만 가져오기<jupyter_code>example_obj.index<jupyter_output><empty_output><jupyter_text>Data에 대한 정보를 저장하기<jupyter_code>example_obj.name = 'number'
example_obj.index.name = 'alphabet'
example_obj<jupyter_output><empty_output><jupyter_text>index 값을 기준으로 데이터 생성<jupyter_code>dict_data_1 = {'a': 1, 'b': 2, 'c': 3, 'd': 4, 'e': 5}
indexes = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
series_obj_1 = Series(dict_data_1, index = indexes)
series_obj_1<jupyter_output><empty_output><jupyter_text>Dataframe- Numpy array-like- Each column can have a different type- Row and column index- Size mutable : insert and delete columns  Series를 모아서 만든 Data Table = 기본 2차원<jupyter_code>from pandas import Series, DataFrame
import pandas as pd
import numpy as np
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, columns = ['first_name', 'last_name', 'age', 'city'])
df<jupyter_output><empty_output><jupyter_text>column 선택<jupyter_code>DataFrame(raw_data, columns = ['age', 'city'])<jupyter_output><empty_output><jupyter_text>새로운 column 추가<jupyter_code>DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city', 'debt'])<jupyter_output><empty_output><jupyter_text>column 선택 - series 추출<jupyter_code>df = DataFrame(raw_data, columns = ['first_name', 'last_name', 'age', 'city', 'debt'])
df.first_name
df['first_name']<jupyter_output><empty_output><jupyter_text>loc - index location<jupyter_code>df.loc[1]<jupyter_output><empty_output><jupyter_text>iloc - index position<jupyter_code>df['age'].iloc[1:]
s = pd.Series(np.nan, index = [49, 48, 47, 46, 1, 2, 3, 4, 5])
s
s.loc[:3]
s.iloc[:3]<jupyter_output><empty_output><jupyter_text>DataFrame - Column에 새로운 데이터 할당<jupyter_code>df.debt = df.age > 40
df<jupyter_output><empty_output><jupyter_text>Transpose<jupyter_code>df.T<jupyter_output><empty_output><jupyter_text>값 출력<jupyter_code>df.values<jupyter_output><empty_output><jupyter_text>csv 변환<jupyter_code>df.to_csv()<jupyter_output><empty_output><jupyter_text>DataFrame - Column을 삭제<jupyter_code>del df['debt']
df
pop = {'Nevada': {2001: 2.4, 2002: 2.9},
        'Ohio': {2000: 1.5, 2001: 1.7, 2002: 3.6}}

DataFrame(pop)<jupyter_output><empty_output><jupyter_text>Selection- Selection with column names<jupyter_code>df = pd.read_excel("./data/excel-comp-data.xlsx")
df.head()<jupyter_output><empty_output><jupyter_text>한개의 column 선택시<jupyter_code>df["account"].head(2)<jupyter_output><empty_output><jupyter_text>1개 이상의 column 선택<jupyter_code>df[["account", "street", "state"]].head(3)<jupyter_output><empty_output><jupyter_text>column 이름 없이 사용하는 index number는 row 기준 표시<jupyter_code>df[:3]<jupyter_output><empty_output><jupyter_text>column 이름과 함께 row index 사용시, 해당 column만<jupyter_code>df["account"][:3]
account_serires = df["account"]
account_serires[:3]<jupyter_output><empty_output><jupyter_text>1개 이상의 index<jupyter_code>account_serires[[0, 1, 2]]<jupyter_output><empty_output><jupyter_text>Boolean index<jupyter_code>account_serires[account_serires < 250000]<jupyter_output><empty_output><jupyter_text>index 변경<jupyter_code>df.index = df['account']
del df['account']
df.head()<jupyter_output><empty_output><jupyter_text>Basic, loc, iloc selection - Column 과 index number<jupyter_code>df[['name', 'street']][:2]<jupyter_output><empty_output><jupyter_text>- Column 과 index name<jupyter_code>df.loc[[211829, 320563], ['name', 'street']]<jupyter_output><empty_output><jupyter_text>- Column number 와 index number<jupyter_code>df.iloc[:2, :2]<jupyter_output><empty_output><jupyter_text>index 재설정<jupyter_code>df.index = list(range(0, 15))
df.head()<jupyter_output><empty_output><jupyter_text>Data drop- 실제 데이터가 날라가는 것은 아니다.- index number로 drop df.drop(1) - 1개 이상의 index number로 drop<jupyter_code>df.drop([0, 1, 2, 3])<jupyter_output><empty_output><jupyter_text>- axis 지정으로 축을 기준으로 drop>column 중에 'city'<jupyter_code>df.drop('city', axis = 1)<jupyter_output><empty_output><jupyter_text>Series addition operation- index 기준으로 연산- 겹치는 index가 없을 경우 NaN값으로 반환<jupyter_code>s1 = Series(range(1, 6), index = list("abced"))
s1
s2 = Series(range(5, 11), index = list("bcedef"))
s2
s1 + s2
s1.add(s2)<jupyter_output><empty_output><jupyter_text>DataFrame operation- df는 column과 index를 모두 고려- add operation을 쓰면 NaN값 0으로 변환- Operation types : add, sub, div, mul<jupyter_code>df1 = DataFrame(np.arange(9).reshape(3, 3),
                columns = list("abc"))
df1
df2 = DataFrame(np.arange(16).reshape(4, 4), 
                index = list("abcd"))
df2
df1 + df2
df1.add(df2, fill_value = 0)<jupyter_output><empty_output><jupyter_text>- column을 기준으로 broadcastiong 발생<jupyter_code>df = DataFrame(np.arange(16).reshape(4, 4),
               columns = list('abcd'))
df
s = Series(np.arange(10, 14),
           index = list('abcd'))
s
df + s<jupyter_output><empty_output><jupyter_text>Series + DataFrame- axis를 기준으로 row broadcasting 실행<jupyter_code>df = DataFrame(np.arange(16).reshape(4, 4),
               columns = list('abcd'))
df
s2 = Series(np.arange(10, 14))
s2
df + s2
df.add(s2, axis = 0)<jupyter_output><empty_output><jupyter_text>lambda- 한 줄로 함수를 표현하는 익명 함수 표기법- Lisp 언어에서 시작된 기법- 오늘날 현대언어에 많이 사용```pythonlambda argument : expression```  하나의 argument만 처리하는 lambda 함수<jupyter_code>f = lambda x : x / 2
f(3)
f = lambda x : x ** 2
f(3)<jupyter_output><empty_output><jupyter_text>이름을 할당하지 않는 lambda 함수<jupyter_code>(lambda x : x + 1)(5)<jupyter_output><empty_output><jupyter_text>map- 함수와 sequence형 데이터를 인자로 받는다.- 각 element마다 입력받은 함수를 적용하여 list로 반환- 일반적으로 함수를 lambda형태로 표현```pythonmap(function, sequence)``` - 2개 이상의 argument가 있을 때는  두 개의 sequence형을 써야한다.<jupyter_code>ex = [1, 2, 3, 4, 5]

f = lambda x, y : x + y
list(map(f, ex, ex))
list(map(lambda x : x + x, ex))<jupyter_output><empty_output><jupyter_text>map for Series- Pandas의 Series type의 데이터에도 map함수 사용가능- function 대신 dict, sequence형 자료형으로 대체 가능<jupyter_code>s1 = Series(np.arange(10))
s1.head(5)
s1.map(lambda x : x ** 2).head(5)<jupyter_output><empty_output><jupyter_text>- dict type으로 데이터 교체 없는 값은 NaN<jupyter_code>z = {1: 'A', 2: 'B', 3: 'C'}
s1.map(z).head(5)<jupyter_output><empty_output><jupyter_text>- 같은 위치의 데이터를 s2로 전환<jupyter_code>s2 = Series(np.arange(10, 20))
s1.map(s2).head(5)<jupyter_output><empty_output><jupyter_text>Map for Series<jupyter_code>df = pd.read_csv("./data/wages.csv")
df.head()
df.sex.unique()
df["sex_code"] = df.sex.map({"male": 0, "female": 1})
df.head(5)<jupyter_output><empty_output><jupyter_text>Replace function- Map 함수의 기능중 데이터 변환 기능만 담당- 데이터 변환시 많이 사용하는 함수<jupyter_code>df.sex.replace({'male': 0, 'female': 1}).head()<jupyter_output><empty_output><jupyter_text>apply for DataFrame- Map과 달리, Series 전체(column)에 해당하는 함수를 적용- 입력값이 Series 데이터로 받아 handling 가능- 내장 연산 함수를 사용해도 사용할 때 똑같은 효과를 거둘 수 있다.- mean, std등 사용가능- scalar 값 이외에 Series값의 반환도 가능<jupyter_code>df_info = df[["earn", "height", "age"]]
df_info.head()
f = lambda x : x.max() - x.min()
df_info.apply(f)
df_info.apply(sum)
df_info.apply(sum)
def f(x):
    return Series([x.min(), x.max(), x.mean()], 
                    index=["min", "max", "mean"])
df_info.apply(f)
f = lambda x : -x
df_info.applymap(f).head(5)
f = lambda x : -x
df_info["earn"].apply(f).head(5)<jupyter_output><empty_output><jupyter_text>describe- Numeric type데이터의 요약 정보를 보여준다.<jupyter_code>df.describe()<jupyter_output><empty_output><jupyter_text>unique- Series data의 유일한 값을 listf로 반환<jupyter_code>df.race.unique()
dict(enumerate(sorted(df["race"].unique())))
value = list(map(int, np.array(list(enumerate(df["race"].unique())))[:, 0].tolist()))
key = np.array(list(enumerate(df["race"].unique())), dtype = str)[:, 1].tolist()

value, key<jupyter_output><empty_output><jupyter_text>sum- 기본적인 column 또는 row 값의 연산을 지원- sum, mean, min, max, count, median, mad, var 등<jupyter_code>df.sum(axis = 0)
df.sum(axis = 1)<jupyter_output><empty_output><jupyter_text>isnull- column 또는 row 값의 NaN 값의 index 반환<jupyter_code>df.isnull()
df.isnull().sum(0)<jupyter_output><empty_output><jupyter_text>sort_values- column 값을 기준으로 데이터를 정렬<jupyter_code>df.sort_values(["age", "earn"], ascending = False).head(10)<jupyter_output><empty_output><jupyter_text>Correlation & Convariance- 상관계수와 공분산을 구하는 함수- corr, cov, corrwith<jupyter_code>df.age.corr(df.earn)
df.age.cov(df.earn)
df.corr()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.16258894629106152, 'fraction_numerical': 0.022906716054196315, 'mean_word_length': 6.802281368821292, 'pattern_counts': {'":': 2, '<': 214, '<?xml version=': 0, '>': 215, 'https://': 2, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '53', 'dir': 'jupyter-structured-clean-dedup', 'id': '332934', 'license': 'MIT', 'n_tokens_mistral': 4853, 'n_tokens_neox': 5103, 'n_words': 821, 'path': 'Chapter.5/2/2.ipynb', 'repo_name': 'alstn2468/Python_For_Machine_Learning', 'size': '10259'}