반응형
질문
나는 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
반응형
댓글