[python] 목록 색인을 기반으로 Pandas 행 선택

데이터 프레임 df가 있습니다.

   20060930  10.103       NaN     10.103   7.981
   20061231  15.915       NaN     15.915  12.686
   20070331   3.196       NaN      3.196   2.710
   20070630   7.907       NaN      7.907   6.459

그런 다음 목록에 표시된 특정 시퀀스 번호를 가진 행을 선택하고 여기에 [1,3]이 있다고 가정하고 왼쪽 :

   20061231  15.915       NaN     15.915  12.686
   20070630   7.907       NaN      7.907   6.459

어떻게 또는 어떤 기능이이를 수행 할 수 있습니까?



답변

List = [1, 3]
df.ix[List]

트릭을해야합니다! 데이터 프레임으로 인덱싱 할 때 항상 .ix () 메서드를 사용합니다. 훨씬 쉽고 유연합니다 …

UPDATE
이것은 더 이상 인덱싱에 허용되는 방법이 아닙니다. 이 ix메서드는 더 이상 사용되지 않습니다. 사용 .iloc정수 기반 인덱싱 및 .loc라벨 기반의 인덱싱.


답변

iloc을 사용할 수도 있습니다.

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

데이터 프레임의 인덱스가 이전 계산으로 인해 행 순서와 일치하지 않으면 작동하지 않습니다. 이 경우 사용 :

df.index.isin([1,3])

… 다른 응답에서 제안한대로.


답변

다른 방법은 (긴 코드 임에도 불구하고) 위의 코드보다 빠릅니다. % timeit 함수를 사용하여 확인하십시오.

df[df.index.isin([1,3])]

추신 : 당신은 이유를 알아냅니다

여기에 이미지 설명 입력


답변

대규모 데이터 세트의 경우 skiprows매개 변수 를 통해 선택한 행만 읽는 것이 메모리 효율적 입니다.

pred = lambda x: x not in [1, 3]
pd.read_csv("data.csv", skiprows=pred, index_col=0, names=...)

이제 1과 3을 제외한 모든 행을 건너 뛰는 파일에서 DataFrame을 반환합니다.


세부

로부터 문서 :

skiprows : 목록 유사 또는 정수 또는 호출 가능, 기본값 None

호출 가능한 경우 호출 가능한 함수는 행 인덱스에 대해 평가되며 행을 건너 뛰어야하는 경우 True를 반환하고 그렇지 않으면 False를 반환합니다. 유효한 호출 가능 인수의 예는 다음과 같습니다.lambda x: x in [0, 2]

이 기능은 버전 pandas 0.20.0+에서 작동합니다. 해당 문제관련 게시물을 참조하십시오 .


답변