<jupyter_start><jupyter_text>5. 판다스<jupyter_code>import pandas as pd
from pandas import Series, DataFrame
import numpy as np<jupyter_output><empty_output><jupyter_text>5.1.1 Series - 1차원 배열 같은 자료구조- 색인(index) 배열의 데이터와 연관된 이름을 가지고있다.<jupyter_code># index와 value들이  각각 매겨진다.
obj = pd.Series([4, 7, -5, 3])
obj
obj.index, obj.values
#따로 index를 지정해주는것도 가능하다
obj2 = pd.Series([4, 7, -5, 3], index=["d", "b", "a", "c"])
obj2<jupyter_output><empty_output><jupyter_text>사전형 데이터 저장<jupyter_code>sdata = {"Ohio": 35000, "Texas": 71000, \
         "Oregon": 16000, "Utah": 5000} 
obj3 = pd.Series(sdata)
obj3
# 사전 객체만 가지고 Series 객체를 생성하면 Series객체의 색인에는 사전의 키값이 순서대로 들어간다.
states = ["California", "Ohio", "Oregon", "Texas"]
obj4 = pd.Series(sdata, index=states)
obj4
# isnull, noynull을 통해 데이터 누락상태를 확인가능

pd.isnull(obj4), pd.notnull(obj4)
# 2개 데이터간의 합산도 가능 (obj4에는 Utah가 존재하지 않아 NaN)

obj3 + obj4
# column 명을 지정해줄 수 있다.
obj4.name = "population" #obj4의 이름지정
obj4.index.name = "state" #column명 지정
obj4
# index명 직접 지정
obj
obj.index = ["Bob", "Steve", "Jeff", "Ryan"]
obj<jupyter_output><empty_output><jupyter_text>5.2 DataFrame<jupyter_code>data = {"state": ["Ohio", "Ohio", "Ohio", "Nevada", \
                   "Nevada", "Nevada"],\
       "year": [2000, 2001, 2002, 2001, 2002, 2003],\
       "pop": [1.5, 1.7, 3.6, 2.4, 2.9, 3.2]}
frame = pd.DataFrame(data)
frame
# 이런식으로 칼럼순서 바꿀 수 있다.
pd.DataFrame(data, columns=["year", "state", "pop"])
# 없는 항목들은 NaN표기, index가 넘어가면 indicies 오류뜬다
frame2 = pd.DataFrame(data, columns = ["year", "state"\
                                       , "pop", "debt"],\
                     index = ["one", "two", "three", "four",\
                             "five", "six"])
frame2
# 이런식으로 칼럼명을 직접 호출해서 접근 가능
frame2["state"]
frame2.year
#loc을 통해 index를 통해 접근가능
frame2.loc['three']
# column 대입도 가능하다.
frame2['debt'] = 16.5
frame2
import numpy as np
frame2['debt'] = np.arange(6.0)
frame2
# 리스트, 배열을 컬럼에 대입할 때, 값의 길이가 DataFrame의 크기와 동일해야한다.

val = pd.Series([-1.2, -1.5, -1.7],\
                index = ["two", "four", "five"])
frame2["debt"] = val
frame2
# 새로운 column명을 대입하면서 boolean값 생성가능. Ohio가 easter인지 아닌지 해보자
frame2["eastern"] = frame2.state == "Ohio"
frame2
#삭제하기
del frame2["eastern"]
frame2
frame2.columns
#바깥의 key값은 Column이 되고, 안쪽의 key값은 row가 된다.
pop = {"Nevada": {2001: 2.4, 2002: 2.9}, \
"Ohio": {2000: 1.5, 2001: 1.7, 2002:3.6}}
frame3 = pd.DataFrame(pop)
frame3
#뒤집기도 가능하다
frame3.T
#직접 index값을 지정해줄 수 있다.
pd.DataFrame(pop, index=[2001, 2002, 2003])
#범위를 지정해주어 뽑아내는것도 가능
frame3
pdata = {"Ohio": frame3["Ohio"][:-1], \
         "Nevada": frame3["Nevada"][:2]}
pd.DataFrame(pdata)
pd.DataFrame(frame3, index = [2000, 2001, 2002])<jupyter_output><empty_output><jupyter_text>5.1.3 색인 객체<jupyter_code>obj = pd.Series(range(3), index=["a", "b", "c"])
obj
index = obj.index
index
# index는 변경이 불가능하다
index[0] = "d"
frame3 = pd.DataFrame(frame3, index= [2000, 2001, 2002])
frame3
# data값 확인해보자
"Ohio"in frame3.columns, 2003 in frame3.index
# pd는 중복된 색인이 가능하고, index값을 선택하면 해당하는 모든값들 output
dup_labels = pd.Index(["foo", "foo", "bar", "bar"])
dup_labels<jupyter_output><empty_output><jupyter_text>5.2 핵심기능<jupyter_code>#### 5.2.1 재색인(reindex)

obj = pd.Series([4.5, 7.2, -5.3, 3.6], \
                index=["d", "b", "a", "c"])
obj
obj2 = obj.reindex(["a", "b", "c", "d", "e"])
obj2
# 누락된 값은 `ffill` 같은 메서드를 이용해 직전의 값으로 채워넣는다.

obj3 = pd.Series(["blue", "pruple", "yellow"], \
                 index=[0,2,4])
obj3
obj3.reindex(range(6), method="ffill")
#reindex는 row,column 둘다변경 가능
frame = pd.DataFrame(np.arange(9).reshape(3,3),\
                     index=["a", "c", "d"],\
                    columns = ["Ohio", "Texas", "California"])
frame
frame2 = frame.reindex(["a", "b", "c", "d"])
frame2
# 예약어를 통해 재색인도 가능
states = ["Texas", "Utah", "California"]
frame.reindex(columns=states)
#이방법은 쓰지말라네?ㅋ
frame.loc[["a", "b", "c", "d"], states]<jupyter_output>/usr/local/lib/python3.7/site-packages/pandas/core/indexing.py:1418: FutureWarning: 
Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/user_guide/indexing.html#deprecate-loc-reindex-listlike
  return self._getitem_tuple(key)<jupyter_text>5.2.2 하나의 로우나 컬럼 삭제하기<jupyter_code>obj = pd.Series(np.arange(5.), index = ["a", "b", "c", "d", "e"])
obj
#drop을 통해 삭제한다
new_obj = obj.drop("c")
new_obj
#2개이상 드랍할때 'ㅡ'
obj.drop(["d", "c"])
#DataFrame 로우, 컬럼모두 삭제가능하다. 다음 예제 봅쉬다
data = pd.DataFrame(np.arange(16).reshape(4,4), \
                    index=["Ohio","Colorado", "Utah", "New York"],\
                   columns = ["one", "two", "three", "four"])
data
data.drop(["Colorado", "Ohio"])
# column 삭제시, axis=1, 또는 axis = "columns"를 인자로 넘긴다
data.drop("two", axis=1)
data.drop(["two", "four"], axis="columns")
obj
#inplace = True 하면 바로 실제 참조값까지 변경한다.
obj.drop("c", inplace=True)
obj
#### 5.2.3 색인하기, 선택하기, 거르기

obj = pd.Series(np.arange(4.), index= ["a", "b", "c", "d"])
obj
# 이런식으로도 된다. value가 2보다 큰것
obj[obj>2]
obj["b":"c"]
#슬라이싱을 이름으로하면 시작점,끝점 모두포함, 숫자는 끝점 포함x
obj["b":"c"] = 5
obj
data = pd.DataFrame(np.arange(16).reshape(4,4), \
                    index=["Ohio","Colorado", "Utah", "New York"],\
                   columns = ["one", "two", "three", "four"])
data
data[1:3]
#column, three가 >5보다 큰것
data[data["three"]>5]<jupyter_output><empty_output><jupyter_text>loc, iloc<jupyter_code>data
data.loc["Colorado", ["two", "three"]]
#iloc 을 이용하여 위와 비슷하게 선택가능
# 3번 row, 4,1,2 column
data.iloc[2, [3,0,1]]
data.iloc[[1,2], [3,0,1]]
data.loc[:"Utah", "two"]
data.iloc[:, :3][data.three > 5]<jupyter_output><empty_output><jupyter_text>5.2.4 정수 색인<jupyter_code>ser = pd.Series(np.arange(3.))
ser
ser2 = pd.Series(np.arange(3.), index = ["a", "b", "c"])
ser2[-1]<jupyter_output><empty_output><jupyter_text>5.2.5  산술 연산, 데이터 정렬- 짝이 맞지 않으면 NaN 이 되어버린다<jupyter_code>s1 = pd.Series([7.3, -2.5, 3.4, 1.5], index = ["a", "c", "d", "e"])
s2 = pd.Series([-2.1, 3.6, -1.5, 4, 3.1], index = ["a", "c", "e", "f", "g"])
s1+s2
# DataFrame도 마찬가지이다.

df1 = pd.DataFrame(np.arange(9.).reshape(3,3), columns = list("bcd"), \
                   index = ["Ohio", "Texas", "Colorado"])
df2 = pd.DataFrame(np.arange(12.).reshape(4,3), columns = list("bde"), \
                   index = ["Utah", "Ohio", "Texas", "Oregon"])
df1 + df2
# NaN으로 처리하고 싶지 않을 시, fill_value값을 인자로 전달하면 된다.

df1 = pd.DataFrame(np.arange(12.).reshape(3,4), columns = list("abcd"))
df2 = pd.DataFrame(np.arange(20.).reshape(4,5), columns=list("abcde"))
# df2의 row1, columns `b`를 nan 으로 변경
df2.loc[1, "b"] = np.nan
df2
df1+df2
df1.add(df2, fill_value=0)
# 1 / df1 == df1.rdiv(1) 같은 효과이다(radd, rsub, rfloordiv, rmul, rpow등이 있다)
1 / df1 == df1.rdiv(1)
#reindex도 fill_value 가능

df1.reindex(columns=df2.columns, fill_value=0)<jupyter_output><empty_output><jupyter_text>DataFrame과 Series간의 연산<jupyter_code>frame = pd.DataFrame(np.arange(12.).reshape(4,3), columns = list("bde"), \
                     index =["Utah", "Ohio", "Texas", "Oregon"])
series = frame.iloc[0]<jupyter_output><empty_output><jupyter_text>5.2.6 함수 적용과 매핑<jupyter_code>frame = pd.DataFrame(np.random.randn(4,3), columns=list("bde"), \
                     index=["Utah", "Ohio", "Texas", "Oregon"])
frame
#apply 사용해서, 각 칼럼이나 로우의 1차원 배열에 함수적용한다. 
# Column계산

f = lambda x: x.max() - x.min()

frame.apply(f)
# Row 계산
frame.apply(f, axis="columns")
# 우와;;
def f(x):
    return pd.Series([x.min(), x.max()], index=["min", "max"])

frame.apply(f)
#실숫값을 문자열로 바꾸고싶다면 `applymap`을 이용한다.
format = lambda x: "%.2f" %x

frame.applymap(format)<jupyter_output><empty_output><jupyter_text>5.2.7 정렬과 순위- `sort_index` 메서드를 사용한다.<jupyter_code>obj = pd.Series(range(4), index = list("dabc"))
obj
obj.sort_index()
frame = pd.DataFrame(np.arange(8).reshape(2,4), index=["three", "one"],
                    columns = list("dabc"))
frame
frame.sort_index()
frame.sort_index(axis=1, ascending=False)
# 값에 따라 정렬하고 싶으면 `sort_values` 를 사용

obj = pd.Series([4, 7, -3, 2])
obj.sort_values()
#1개의 칼럼만 정렬하고 싶을때는 이름을 지정해준다.

frame = pd.DataFrame({"b": [4, 7, -3, 2], "a": [0, 1, 0, 1]})
frame.sort_values(by="b")
#여러개는 list로 항목들을 넣어준다.
frame.sort_values(by=["a", "b"])
#각 항목별 rank를 매긴다. 동점인 항목에 대해서는 평균순위를 매긴다.
obj = pd.Series([7, -5, 7, 4, 2, 0, 4])
obj.rank()
# 나타나는 순서에 따라 순위를 매길 수 도있음.
obj.rank(method="first")
# 그룹내에서 높은 순위 적용
obj.rank(ascending=False, method="max")
#### 5.2.8 중복 색인
obj = pd.Series(range(5), index=list("aabbc"))
obj
# obj.index.is_unique 는 중복되는 색인값이 없는지 보여준다.
obj.index.is_unique
df = pd.DataFrame(np.random.randn(4,3), index = list("aabb"))
df
df.loc["b"]<jupyter_output><empty_output><jupyter_text>5.3 기술 통계 계산과 요약<jupyter_code>data = {"one": [1.4, 7.1, np.nan, 0.75], "two":[np.nan, -4.5, np.nan, -1.3]}

df = pd.DataFrame(data, index=list("abcd"))
df
df.mean(axis=1, skipna=False), df.mean(axis=1, skipna=True)
#idxmin, idxmax 는 최솟값 최댓값을 가지고 있는 색인값과 같은 간접통계를 반환
df.idxmax()
df.cumsum()
df.describe()<jupyter_output><empty_output><jupyter_text>5.3.1 상관관계와 공분산<jupyter_code>import sys
import pandas_datareader
import pandas_datareader.data as web
all_data = {ticker: web.get_data_yahoo(ticker) \
            for ticker in ["AAPL", "IBM", "MSFT", "GOOG"]}
price = pd.DataFrame({ticker: data["Adj Close"]\
                     for ticker, data in all_data.items()})
volume = pd.DataFrame({ticker: data["Volume"]\
                      for ticker, data in all_data.items()})
returns = price.pct_change()
returns.tail()
#corr 은 상관관계, cov 공분산을 계산한다
returns["MSFT"].corr(returns["IBM"])
returns["MSFT"].cov(returns["IBM"])<jupyter_output><empty_output><jupyter_text>5.3.2 유일값, 값 세기, 멤버십<jupyter_code>obj = pd.Series(list("cadaabbcc"))
obj.unique()
obj.value_counts()<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.19697593087842008, 'fraction_numerical': 0.04299526846327916, 'mean_word_length': 4.071987480438184, 'pattern_counts': {'":': 17, '<': 64, '<?xml version=': 0, '>': 68, 'https://': 1, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 2, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '16', 'dir': 'jupyter-structured-clean-dedup', 'id': '614017', 'license': 'MIT', 'n_tokens_mistral': 5081, 'n_tokens_neox': 5400, 'n_words': 957, 'path': '5_Pandas.ipynb', 'repo_name': 'kangyeolyoun2/Python_for_Data_Analysis', 'size': '9722'}