본문 바로가기
Python/Python FAQ

Python 인덱스를 사용하여 pandas DataFrame의 특정 셀에 값을 설정합니다., Set value for particular cell in pandas DataFrame using index

by 베타코드 2023. 7. 10.
반응형

질문


나는 Pandas DataFrame을 만들었습니다.

df = DataFrame(index=['A','B','C'], columns=['x','y'])

그리고 이것을 얻었습니다.

    x    y
A  NaN  NaN
B  NaN  NaN
C  NaN  NaN

이제, 특정 셀에 값을 할당하고 싶습니다. 예를 들어, 행 C와 열 x에 값을 할당하고 싶습니다. 다음 결과를 기대합니다:

    x    y
A  NaN  NaN
B  NaN  NaN
C  10  NaN

다음 코드로 이를 수행할 것으로 예상합니다:

df.xs('C')['x'] = 10

그러나, df의 내용이 변경되지 않았습니다. 데이터프레임은 여전히 NaN만을 포함하고 있습니다.

어떤 제안이 있나요?


답변


RukTech의 답변, df.set_value('C', 'x', 10)은 아래에 제안한 옵션보다 훨씬 빠릅니다. 그러나 폐기 예정되었습니다.

앞으로는 .iat/.at을 권장하는 방법입니다.


df.xs('C')['x']=10이 작동하지 않는 이유:

df.xs('C')는 기본적으로 데이터의 복사본과 함께 새로운 데이터프레임을 반환하므로

df.xs('C')['x']=10

이 작업은 이 새로운 데이터프레임만 수정합니다.

df['x']df 데이터프레임의 뷰를 반환하므로

df['x']['C'] = 10

이 작업은 df 자체를 수정합니다.

경고: 때로는 작업이 복사본을 반환하는지 뷰를 반환하는지 예측하기 어렵습니다. 이러한 이유로 문서에서는 "체인 인덱싱"과 함께 대입을 피하도록 권장합니다.


따라서 권장되는 대체 방법은

df.at['C', 'x'] = 10

입니다. 이렇게 하면 df가 수정됩니다.


In [18]: %timeit df.set_value('C', 'x', 10)
100000 loops, best of 3: 2.9 µs per loop

In [20]: %timeit df['x']['C'] = 10
100000 loops, best of 3: 6.31 µs per loop

In [81]: %timeit df.at['C', 'x'] = 10
100000 loops, best of 3: 9.2 µs per loop
반응형

댓글