(7주차) 10월20일
행을 선택하는 방법
- (1/3) 행을 선택하는 방법 (기본)
- (2/3) 행을 선택하는 방법 (람다사용)
- (3/3) 과제설명
import numpy as np
import pandas as pd
np.random.seed(1)
dic= {'X1':np.random.normal(0,1,5),
'X2':np.random.normal(0,1,5),
'X3':np.random.normal(0,1,5),
'X4':np.random.normal(0,1,5),
'X5':np.random.normal(0,1,5),
'X6':np.random.normal(0,1,5)}
df1=pd.DataFrame(dic)
df1
- 방법1
df1.iloc[0] # 이상해
- 방법2
df1.iloc[[0]]
- 방법3
df1.iloc[0,:]
- 방법4
df1.iloc[[0],:]
- 방법5
df1.loc[0] # 이상해
- 방법6
df1.loc[[0]]
- 방법7
df1.loc[0,:]
- 방법8
df1.loc[[0],:]
- 방법9
df1.iloc[[True,False,False,False,False]]
- 방법10
df1.iloc[[True,False,False,False,False],:]
- 방법11
df1.loc[[True,False,False,False,False]]
- 방법12
df1.loc[[True,False,False,False,False],:]
df1
- 방법1
df1.iloc[[0,2],:]
- 방법2
df1.loc[[0,2],:]
- 그외에 여러행을 뽑는 방법이 있음; 슬라이싱, 불인덱싱
- 인덱스가 정수가 아닌경우
_df= pd.DataFrame({'A':[1,2,3,4],'B':[4,5,6,7]},index=list('abcd'))
_df
_df.loc['a':'c',:]
_df.iloc[0:3,:]
_df.loc[['a','b','c'],:]
_df.iloc[[0,1,2],:]
- 대부분의 경우 observation에 특정한 이름이 있는 경우는 없으므로 loc이 그다지 쓸모 없음
- 그렇지만 특정경우에는 쓸모가 있음
np.random.normal(size=(20,4))
np.random.seed(1)
_df= pd.DataFrame(np.random.normal(size=(20,4)), columns=list('ABCD'), index=pd.date_range('20201225',periods=20))
_df
- 1월5일부터 1월8일까지의 자료만 보고싶다.
_df.loc['20210105':'20210108']
- iloc으로 하려면 힘들다.
_df.index
pd.Series(_df.index)
_df.iloc[11:15]
- 저는 아래와 같은 실수를 자주해요
_df.loc['A']
- 올바른 방법
_df['A']
- 아래의 사실을 기억하자.
-
기본적으로는 iloc, loc은
[2], [2:]처럼 1차원으로 원소를 인덱싱할수도 있고,[2,3], [:,2]와 같이 2차원으로 인덱싱할 수도 있다. -
1차원으로 인덱싱하는 경우는 기본적으로 행을 인덱싱한다 $\to$ iloc, loc은 행과 더 친하고 열과 친하지 않다.
-
따라서 열을 선택하는 방법에 있어서 loc, iloc이 그렇제 좋은 방법은 아니다.
-
그렇지만 열을 선택하는 방법은 iloc이나 loc이 제일 편리하다. (이외의 다른 방법이 마땅하게 없음) 그래서 열을 선택할때도 iloc이나 loc을 선호한다.
_df.iloc[::2]
- 이 방법은 칼럼에도 적용가능
_df.iloc[:,::2]
- 칼럼에는 잘 쓰지 않는이유?
-
row는 특정간격으로 뽑는 일이 빈번함. (예를들어 일별데이터를 주별데이터로 바꾸고싶을때, 바꾸고 싶을 경우?)
-
col을 특정간격으로 뽑아야 하는 일은 없음
np.random.seed(1)
df2= pd.DataFrame(np.random.normal(size=(10,4)),columns=list('ABCD'))
df2
- 방법1
df2.loc[map(lambda x: x>0,df2['A']),:]
- 방법2
df2.loc[lambda df: df['A']>0,:]
- ??
- map의 기능은 (1) 리스트를 원소별로 분해하여 (2) 어떠한 함수를 적용하여 아웃풋을 구한뒤 (3) 각각의 아웃풋을 다시 하나의 리스트로 묶음
- 우리는 이중에서 (1),(3)에만 집중했음
- 하지만 생각해보면 일단 (2) 일단 함수를 적용하는 기능이 있었음
- 그런데 위의 코든느 함수를 적용한 결과가 아니라 함수 오브젝트 자체를 전달하여도 동작함
요약!!
- True, False로 이루어진 벡터를 리스트의 형태로 전달하여 인덱상했음 (원래 우리가 알고 있는 개념)
- True, False로 이루어진 벡터를 리턴할 수 있는 함수오브젝트 자체를 전달해도 인덱싱이 가능
- 방법3
df2.iloc[map(lambda x: x>0,df2['A']),:]
- 방법4: 실패
df2.iloc[lambda df: df['A']>0,:]
- 위에서 iloc을 loc으로 바꾸면 되는데..
- iloc입장에서는 조금 서운함
df2
- 방법1
df2.loc[map(lambda x,y: x>0 and y<0, df2['A'],df2['C']),:]
- 방법2
df2.loc[map(lambda x,y: x>0 & y<0, df2['A'],df2['C']),:]
- ??? 아래를 관찰
보충학습
0<3.2 & 0<2.2
(0<3.2) & (0<2.2)
보충학습끝
위의코드도 괄호로 묶어주면 잘 동작한다.
df2.loc[map(lambda x,y: (x>0) & (y<0), df2['A'],df2['C']),:]
- 방법3
df2.loc[lambda df: (df['A'] >0) & (df['C']<0)]
아래는 실행되지 않는다
df2.loc[lambda df: (df['A'] >0) and (df['C']<0)]
실행되지 않는이유
np.array([True, False]) & np.array([True, True])
np.array([True, False]) and np.array([True, True])
- iloc을 이용한 방법은 생략
df2
A> -1 이고 C < 1.5 인 row를 선택