2013-07-09 4 views
6

팬더에서 DataFrame의 하위 세트에 값을 할당하는 일반적인 방법이 있습니까? 직접 액세스 할 수있는 수백 개의 행과 열이 있지만 각 행, col 쌍을 반복하지 않고 값을 편집하는 방법을 파악하지 못했습니다. 예를 들어 :인덱스를 사용하여 팬더 DataFrame 편집

In [1]: import pandas, numpy 

In [2]: array = numpy.arange(30).reshape(3,10) 

In [3]: df = pandas.DataFrame(array, index=list("ABC")) 

In [4]: df 
Out[4]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 1 2 3 4 5 6 7 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 21 22 23 24 25 26 27 28 29 

In [5]: rows = ['A','C'] 

In [6]: columns = [1,4,7] 

In [7]: df[columns].ix[rows] 
Out[7]: 
    1 4 7 
A 1 4 7 
C 21 24 27 

In [8]: df[columns].ix[rows] = 900 

In [9]: df 
Out[9]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 1 2 3 4 5 6 7 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 21 22 23 24 25 26 27 28 29 

나는 여기에서 일어나고있는 것은 내가 원래 DataFrame에 할당 할 수 없습니다 의미하는보기보다는 사본을 얻고 있다고 믿습니다. 그게 내 문제 야? 이러한 행 x 열을 편집하는 가장 효율적인 방법은 무엇입니까 (가능한 경우 DataFrame이 많은 양의 메모리를 차지할 수 있으므로 인 페스가 좋음)?

또한 이러한 값을 올바른 모양의 DataFrame으로 바꾸려면 어떻게해야합니까?

답변

10

대입 표현식에서 사용 loc합니다 (=는 그것이 뷰 또는 사본인지와 관련이없는 뜻!) : 당신이 이전에 0.11 버전을 사용하는 경우

In [11]: df.loc[rows, columns] = 99 

In [12]: df 
Out[12]: 
    0 1 2 3 4 5 6 7 8 9 
A 0 99 2 3 99 5 6 99 8 9 
B 10 11 12 13 14 15 16 17 18 19 
C 20 99 22 23 99 25 26 99 28 29 

당신은 .ix을 사용할 수 있습니다 .

@Jeff으로 코멘트 :

이 할당 식 ('advanced indexing with ix' section of the docs 참조) 및 ( 반환 것들, 예를 들어, .at.iat을 할당 표현이 있지만) 아무것도 반환하지 않습니다.

df.loc[rows,columns]보기를 반환하지만 대개 사본입니다. 혼란 스럽지만 효율성을 위해 노력했습니다.

결론 : 사용ix, loc, iloc (위와 같이) 설정 및 가 복사을 수정하지 않습니다.

문서의 'view versus copy' 섹션을 참조하십시오.

+0

df.loc에 대한 속성 오류가 발생합니다. 팬더 0.11에서 이것이 새로운 것으로 가정합니다. 그 전에 동등한 제품이 있었나요? 아니면 매달마다 팬더를 업그레이드해야하는 이유입니까? – Noah

+0

또한 문서의 어딘가에서 복사가 아닌보기라는 것을 설명합니까? http://pandas.pydata.org/pandas-docs/dev/indexing.html#indexing-view-versus-copy – Noah

+0

을 참조하십시오. 확실히 문서는보기 또는 사본 일 때 더 자세히 설명해야합니다. 과거에 문서 몇 개를 추가 할 것입니다. (모든 기능을 사용하면됩니다.) –