(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를 선택