<SYSTEM_TASK:>
Given the following text description, write Python code to implement the functionality described below step by step
<END_TASK>
<USER_TASK:>
Description:
 pandas 패키지의 소개
pandas 패키지
Index를 가진 자료형인 R의 data.frame 자료형을 Python에서 구현
참고 자료
http
Step1:  Vectorized Operation
Step2:  명시적인 Index를 가지는 Series
생성시 index 인수로 Index 지정
Index 원소는 각 데이터에 대한 key 역할을 하는 Label
dict
Step3:  Series Indexing 1
Step4:  Series Indexing 2
Step5:  dict 연산
Step6:  dict 데이터를 이용한 Series 생성
별도의 index를 지정하면 지정한 자료만으로 생성
Step7:  Index 기준 연산
Step8:  Index 이름
Step9:  Index 변경
Step10:  DataFrame
Multi-Series
동일한 Row 인덱스를 사용하는 복수 Series
Series를 value로 가지는 dict
2차원 행렬
DataFrame을 행렬로 생각하면 각 Series는 행렬의 Column의 역할
NumPy Array와 차이점 
각 Column(Series)마다 type이 달라도 된다.
Column Index
(Row) Index와  Column Index를 가진다.
각 Column(Series)에 Label 지정 가능
(Row) Index와 Column Label을 동시에 사용하여 자료 접근 가능
Step11:  명시적인 Column/Row Index를 가지는 DataFrame
Step12:  Single Column Access
Step13:  Cloumn Data Update
Step14:  Add Column
Step15:  Delete Column
Step16:  inplace 옵션
함수/메소드는 두 가지 종류
그 객체 자체를 변형
해당 객체는 그대로 두고 변형된 새로운 객체를 출력
DataFrame 메소드 대부분은 inplace 옵션을 가짐
inplace=True이면 출력을 None으로 하고 객체 자체를 변형
inplace=False이면 객체 자체는 보존하고 변형된 새로운 객체를 출력
Step17:  drop 메소드를 사용한 Row/Column 삭제
del 함수 
inplace 연산
drop 메소드 
삭제된 Series/DataFrame 출력
Series는 Row 삭제
DataFrame은 axis 인수로 Row/Column 선택
axis=0(디폴트)
Step18:  Nested dict를 사용한 DataFrame 생성
Step19:  Series dict를 사용한 DataFrame 생성
Step20:  NumPy array로 변환
Step21:  DataFrame의 Column Indexing
Single Label key
Single Label attribute
Label List Fancy Indexing
<ASSISTANT_TASK:>
Python Code:
s = pd.Series([4, 7, -5, 3])
s
s.values
type(s.values)
s.index
type(s.index)
Explanation: pandas 패키지의 소개
pandas 패키지
Index를 가진 자료형인 R의 data.frame 자료형을 Python에서 구현
참고 자료
http://pandas.pydata.org/
http://pandas.pydata.org/pandas-docs/stable/10min.html
http://pandas.pydata.org/pandas-docs/stable/tutorials.html
pandas 자료형
Series
시계열 데이터
Index를 가지는 1차원 NumPy Array
DataFrame
복수 필드 시계열 데이터 또는 테이블 데이터
Index를 가지는 2차원 NumPy Array
Index
Label: 각각의 Row/Column에 대한 이름 
Name: 인덱스 자체에 대한 이름
<img src="https://docs.google.com/drawings/d/12FKb94RlpNp7hZNndpnLxmdMJn3FoLfGwkUAh33OmOw/pub?w=602&h=446" style="width:60%; margin:0 auto 0 auto;">
Series
Row Index를 가지는 자료열
생성
추가/삭제
Indexing
명시적인 Index를 가지지 않는 Series
End of explanation
s * 2
np.exp(s)
Explanation: Vectorized Operation
End of explanation
s2 = pd.Series([4, 7, -5, 3], index=["d", "b", "a", "c"])
s2
s2.index
Explanation: 명시적인 Index를 가지는 Series
생성시 index 인수로 Index 지정
Index 원소는 각 데이터에 대한 key 역할을 하는 Label
dict
End of explanation
s2['a']
s2['b':'c']
s2[["a", "b"]]
Explanation: Series Indexing 1: Label Indexing
Single Label
Label Slicing
마지막 원소 포함
Label을 원소로 가지는 Label (Label을 사용한 List Fancy Indexing)
주어진 순서대로 재배열
End of explanation
s2[2]
s2[1:4]
s2[[2, 1]]
s2[s2 > 0]
Explanation: Series Indexing 2: Integer Indexing
Single Integer
Integer Slicing
마지막 원소를 포함하지 않는 일반적인 Slicing
Integer List Indexing (List Fancy Indexing)
Boolearn Fancy Indexing
End of explanation
"a" in s2, "e" in s2
for i, j in s2.iteritems():
    print(i, j)
s2["d":"a"]
Explanation: dict 연산
End of explanation
sdata = {'Ohio': 35000, 'Texas': 71000, 'Oregon': 16000, 'Utah': 5000}
s3 = pd.Series(sdata)
s3
states = ['Califonia', 'Ohio', 'Oregon', 'Texas']
s4 = pd.Series(sdata, index=states)
s4
pd.isnull(s)
pd.notnull(s4)
s4.isnull()
s4.notnull()
Explanation: dict 데이터를 이용한 Series 생성
별도의 index를 지정하면 지정한 자료만으로 생성
End of explanation
print(s3.values, s4.values)
s3.values + s4.values
s3 + s4   #Utah가 NaN인 것을 보아하니 값이 둘 다 있을 때만 연산이 되고 하나라도 없으면 NaN으로 처리되나보네
Explanation: Index 기준 연산
End of explanation
s4
s4.name = "population"
s4
s4.index.name = "state"
s4
Explanation: Index 이름
End of explanation
s
s.index
s.index = ['Bob', 'Steve', 'Jeff', 'Ryan']
s
s.index
Explanation: Index 변경
End of explanation
data = {
    'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2001, 2001, 2002, 2001, 2002],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]
}
df = pd.DataFrame(data)
df
pd.DataFrame(data, columns=['year', 'state', 'pop'])
df.dtypes
Explanation: DataFrame
Multi-Series
동일한 Row 인덱스를 사용하는 복수 Series
Series를 value로 가지는 dict
2차원 행렬
DataFrame을 행렬로 생각하면 각 Series는 행렬의 Column의 역할
NumPy Array와 차이점 
각 Column(Series)마다 type이 달라도 된다.
Column Index
(Row) Index와  Column Index를 가진다.
각 Column(Series)에 Label 지정 가능
(Row) Index와 Column Label을 동시에 사용하여 자료 접근 가능
End of explanation
df2 = pd.DataFrame(data,
                  columns=['year', 'state', 'pop', 'debt'],
                  index=['one', 'two', 'three', 'four', 'five'])
df2
Explanation: 명시적인 Column/Row Index를 가지는 DataFrame
End of explanation
df["state"]
type(df["state"]), type([df["state"]])
[df["state"]]
df.state
Explanation: Single Column Access
End of explanation
df2['debt'] = 16.5, 16.2, 16.3, 16.7, 16.2
df2
df2['debt'] = 16.5
df2
df2['debt'] = np.arange(5)
df2
df2['debt'] = pd.DataFrame([-1.2, -1.5, -1.7], index=['two', 'four', 'five'])
df2
Explanation: Cloumn Data Update
End of explanation
df2['eastern'] = df2.state == 'Ohio'
df2
Explanation: Add Column
End of explanation
del df2["eastern"]
df2
Explanation: Delete Column
End of explanation
x = [3, 6, 1, 4]
sorted(x)
x
x.sort()
x
Explanation: inplace 옵션
함수/메소드는 두 가지 종류
그 객체 자체를 변형
해당 객체는 그대로 두고 변형된 새로운 객체를 출력
DataFrame 메소드 대부분은 inplace 옵션을 가짐
inplace=True이면 출력을 None으로 하고 객체 자체를 변형
inplace=False이면 객체 자체는 보존하고 변형된 새로운 객체를 출력
End of explanation
s = pd.Series(np.arange(5.), index=['a', 'b', 'c', 'd', 'e'])
s
s2 = s.drop('c')
s2
s
s.drop(["b", "c"])
df = pd.DataFrame(np.arange(16).reshape((4, 4)),
                 index=['Ohio', 'Colorado', 'Utah', 'New York'],
                 columns=['one', 'two', 'three', 'four'])
df
df.drop(['Colorado', 'Ohio'])
df.drop('two', axis=1)
df.drop(['two', 'four'], axis=1)
Explanation: drop 메소드를 사용한 Row/Column 삭제
del 함수 
inplace 연산
drop 메소드 
삭제된 Series/DataFrame 출력
Series는 Row 삭제
DataFrame은 axis 인수로 Row/Column 선택
axis=0(디폴트): Row
axis=1: Column
End of explanation
pop = {
    'Nevada': {
        2001: 2.4,
        2002: 2.9
    },
    'Ohio': {
        2000: 1.5,
        2001: 1.7,
        2002: 3.6
    }
}
df3 = pd.DataFrame(pop)
df3
Explanation: Nested dict를 사용한 DataFrame 생성
End of explanation
pdata = {
    'Ohio': df3['Ohio'][:-1],
    'Nevada': df3['Nevada'][:3]
}
pd.DataFrame(pdata)
Explanation: Series dict를 사용한 DataFrame 생성
End of explanation
df3.values
df2.values
df3.values
df2.values
Explanation: NumPy array로 변환
End of explanation
df2
df2["year"]
df2.year
df2[["state", "debt", "year"]]
df2[["year"]]
Explanation: DataFrame의 Column Indexing
Single Label key
Single Label attribute
Label List Fancy Indexing
End of explanation
<END_TASK>