data = {
    'state': ['Ohio', 'Ohio', 'Ohio', 'Nevada', 'Nevada'],
    'year': [2000, 2001, 2002, 2001, 2002],
    'pop': [1.5, 1.7, 3.6, 2.4, 2.9]
}

df = pd.DataFrame(data)
df

# 순차적 indexing 과 동일
df.ix[1:3, ["state", "pop"]]

df2 = pd.DataFrame(data,
                  columns=['year', 'state', 'pop'],
                  index=['one', 'two', 'three', 'four', 'five'])
df2

# , 이용
df2.ix[["two", "three"], ["state", "pop"]]

# column에도 integer 기반 indexing 가능
df2.ix[["two", "three"], :2]

# column에도 Label Slicing 가능
df2.ix[["two", "three"], "state":"pop"]

# `:` 사용
df2.ix[:, ["state", "pop"]]

# `:` 사용
df2.ix[["two", "five"], :]

"""
Explanation: Pandas 고급 인덱싱
pandas는 numpy 행렬과 같이 comma를 사용한 복수 인덱싱을 지원하기 위해 다음과 같은 특별한 인덱서 속성을 제공한다.

ix : 라벨과 숫자를 동시에 지원하는 복수 인덱싱
loc : 라벨 기반의 복수 인덱싱
iloc : 숫자 기반의 복수 인덱싱

ix 인덱서

행(Row)/열(Column) 양쪽에서 라벨 인덱싱, 숫자 인덱싱, 불리언 인덱싱(행만) 동시 가능
단일 숫자 인덱싱 가능
열(column)도 라벨이 아닌 숫자 인덱싱 가능
열(column)도 라벨 슬라이싱(label slicing) 가능
End of explanation
"""


df = pd.DataFrame(np.random.randn(5, 3))
df

df.columns = ["c1", "c2", "c3"]
df.ix[0:2, 1:2]

"""
Explanation: Index Label이 없는 경우의 주의점

Label이 지정되지 않는 경우에는 integer slicing을 label slicing으로 간주하여 마지막 값을 포함한다
End of explanation
"""


np.random.seed(1)
df = pd.DataFrame(np.random.randint(1, 11, size=(4,3)), 
                  columns=["A", "B", "C"], index=["a", "b", "c", "d"])
df

df.ix[["a", "c"], "B":"C"]

df.ix[[0, 2], 1:3]

df.loc[["a", "c"], "B":"C"]

df.ix[2:4, 1:3]

df.loc[2:4, 1:3]

df.iloc[2:4, 1:3]

df.iloc[["a", "c"], "B":"C"]

"""
Explanation: loc 인덱서


라벨 기준 인덱싱


숫자가 오더라도 라벨로 인식한다.

라벨 리스트 가능
라벨 슬라이싱 가능
불리언 배열 가능

iloc 인덱서


숫자 기준 인덱싱


문자열 라벨은 불가

숫자 리스트 가능
숫자 슬라이싱 가능
불리언 배열 가능
End of explanation
"""


