정수 인덱스로 팬더 시리즈 / 데이터 프레임 행 선택


395

나는 이유에 궁금 df[2]동안 지원되지 않습니다 df.ix[2]하고 df[2:3]모두 작동합니다.

In [26]: df.ix[2]
Out[26]: 
A    1.027680
B    1.514210
C   -1.466963
D   -0.162339
Name: 2000-01-03 00:00:00

In [27]: df[2:3]
Out[27]: 
                  A        B         C         D
2000-01-03  1.02768  1.51421 -1.466963 -0.162339

파이썬 인덱싱 규칙과 일관된 df[2]방식으로 작동 할 것으로 기대 합니다 df[2:3]. 단일 정수로 인덱싱 행을 지원하지 않는 설계 이유가 있습니까?


4
df.ix[2]작동하지 않습니다-최소한pandas version '0.19.2'
Zahra

9
인덱싱 연산자를 통해 행 및 열 선택의 차이를보기 위해 [], 이하이 응답 참조 . 또한 사용 .ix하지 마십시오. 더 이상 사용되지 않습니다
Ted

답변:


551

@HYRY 에코, 0.11의 새로운 문서를 참조하십시오

http://pandas.pydata.org/pandas-docs/stable/indexing.html

여기에는 .iloc정수 색인 만 명시 적으로 지원하는 새로운 연산자가 있습니다..loc 만 명시 적으로 지원하고 레이블 색인 만 명시 적으로 지원하는

예를 들어이 시나리오를 상상

In [1]: df = pd.DataFrame(np.random.rand(5,2),index=range(0,10,2),columns=list('AB'))

In [2]: df
Out[2]: 
          A         B
0  1.068932 -0.794307
2 -0.470056  1.192211
4 -0.284561  0.756029
6  1.037563 -0.267820
8 -0.538478 -0.800654

In [5]: df.iloc[[2]]
Out[5]: 
          A         B
4 -0.284561  0.756029

In [6]: df.loc[[2]]
Out[6]: 
          A         B
2 -0.470056  1.192211

[] 레이블 위치별로 행만 슬라이스


7
두 번째와 세 번째와 네 번째 행을 원한다면 어떻게해야합니까?
FaCoffee

1
인덱서 목록을 전달할 수 있습니다. 문서가 위를 가리키고 있음
Jeff

2
누구든지이 이름들에 대한 정당성이 있습니까? 왜 ilocloc인지 레이블 인지 확실하지 않기 때문에 기억하기가 어렵습니다 .
kilojoules

3
@kilojoules .iloc는 색인에서 순서대로 항목을 찾습니다 (예 :) 는 .iloc[[2]]두 번째 "행"입니다 df. 해당 행은 인덱스 위치에 4있습니다. .loc색인 값으로 조회합니다. 아마 "iloc"은 "i"와 같을 A[i]까요? :)
Jim K.

1
@Jeff-이것은 훌륭하게 작동하지만 데이터 프레임에서 행을 복제하여 df.loc[-1] = df.iloc[[0]]삽입 하려는 경우 어떻게됩니까 ? 프레임에 오류를 제공하는 추가 색인 열이 제공됩니다 ValueError: cannot set a row with mismatched columns ( stackoverflow.com/questions/47340571/… 참조 )
Growler

63

DataFrame 인덱싱 연산자의 기본 목적은 []열을 선택하는 것입니다.

인덱싱 연산자에 문자열 또는 정수가 전달되면 해당 특정 이름의 열을 찾아 Series로 반환합니다.

따라서 위의 질문에서 : df[2]integer 값과 일치하는 열 이름을 검색합니다 2. 이 열이 존재하지 않고 a KeyError가 발생합니다.


DataFrame 인덱싱 연산자는 슬라이스 표기법을 사용할 때 행을 선택하도록 동작을 완전히 변경합니다.

이상하게도 슬라이스가 주어지면 DataFrame 인덱싱 연산자는 행을 선택하고 정수 위치 또는 인덱스 레이블로 행을 선택할 수 있습니다.

df[2:3]

마지막 요소를 제외하고 정수 위치가 2에서 3까지 인 행부터 시작합니다. 따라서 단 하나의 행입니다. 다음은 정수 위치 6에서 시작하여 세 번째 행마다 20을 포함하지 않는 행을 선택합니다.

df[6:20:3]

DataFrame 인덱스에 문자열이있는 경우 문자열 레이블로 구성된 슬라이스를 사용할 수도 있습니다. 자세한 내용 은 .iloc 대 .loc에서이 솔루션을 참조하십시오 .

나는이 슬라이스 표기법을 명시적이고 거의 사용되지 않은 인덱싱 연산자와 함께 사용하지 않습니다. 행으로자를 때으로 붙어 있습니다 .loc/.iloc.


indxeing 연산자를 사용하여 다른 데이터 프레임에 행을 추가하려고 시도하지만 다른 데이터 프레임은 비어 있습니다. 왜?
FindOutIslamNow

23

DataFrame을 Series의 dict로 생각할 수 있습니다. df[key]열 인덱스를 선택하여 keySeries 객체를 반환합니다.

그러나 [] 내부를 슬라이싱하면 행이 슬라이스됩니다. 매우 일반적인 작업이기 때문입니다.

자세한 내용은 문서를 읽을 수 있습니다.

http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics


힌트 주셔서 감사합니다. 재밌지 만, 이런 종류의 것은 여전히 ​​팬더에게 질문을 던지는 것입니다. 특정 상황에서 동작에 예외를 추가하는 것은 .. 나에게 약간의 편의를 위해 일관성을 희생하는 것처럼 느껴집니다.
칼 버거

15

팬더 테이블에 대한 인덱스 기반 액세스를 위해 테이블을 Numpy 배열로 변환하는 numpy.as_array 옵션을 고려할 수도 있습니다.

np_df = df.as_matrix()

그리고

np_df[i] 

작동 할 것이다.


11
그것은 데이터 프레임 인덱스의 모든 목적과 팬더가 제공하는 다른 모든 것을
Fábio Dias

6

소스 코드를 살펴볼 수 있습니다 .

DataFrame_slice()을 슬라이스 하는 전용 함수 가 DataFrame있으며 매개 변수 axis가 슬라이스 할 축을 결정할 수 있습니다 . __getitem__()에 대한 DataFrame호출하는 동안 축을 설정하지 않습니다 _slice(). 따라서 _slice()기본 축 0으로 슬라이스하십시오.

간단한 실험을 통해 도움이 될 수 있습니다.

print df._slice(slice(0, 2))
print df._slice(slice(0, 2), 0)
print df._slice(slice(0, 2), 1)

5

이처럼 데이터 프레임을 반복 할 수 있습니다.

for ad in range(1,dataframe_c.size):
    print(dataframe_c.values[ad])
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.