나는 이유에 궁금 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]
. 단일 정수로 인덱싱 행을 지원하지 않는 설계 이유가 있습니까?
답변
@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
[]
레이블 위치별로 행만 슬라이스
답변
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
.
답변
DataFrame을 Series의 dict로 생각할 수 있습니다. df[key]
열 인덱스를 선택하여 key
Series 객체를 반환합니다.
그러나 [] 내부를 슬라이싱하면 행이 슬라이스됩니다. 매우 일반적인 작업이기 때문입니다.
자세한 내용은 문서를 읽을 수 있습니다.
http://pandas.pydata.org/pandas-docs/stable/indexing.html#basics
답변
팬더 테이블에 대한 인덱스 기반 액세스를 위해 테이블을 Numpy 배열로 변환하는 numpy.as_array 옵션을 고려할 수도 있습니다.
np_df = df.as_matrix()
그리고
np_df[i]
작동 할 것이다.
답변
소스 코드를 살펴볼 수 있습니다 .
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)
답변
이처럼 데이터 프레임을 반복 할 수 있습니다.
for ad in range(1,dataframe_c.size):
print(dataframe_c.values[ad])
답변
