[python] 인덱스를 사용하여 팬더 DataFrame의 특정 셀에 대한 값 설정

팬더 데이터 프레임을 만들었습니다

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

그리고 이것을 얻었다

    xy
NaN NaN
B NaN NaN
C NaN NaN

그런 다음 행 ‘C’와 열 ‘x’와 같은 특정 셀에 값을 할당하고 싶습니다. 나는 그런 결과를 얻을 것으로 기대했다.

    xy
NaN NaN
B NaN NaN
C 10 NaN

이 코드로 :

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

그러나 내용은 df바뀌지 않았습니다. 그것은 다시 NaNDataFrame 에만 있습니다.

어떤 제안?



답변

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자신을 수정 합니다.

경고 : 작업이 복사본 또는 뷰를 반환하는지 예측하기 어려운 경우가 있습니다. 이러한 이유로 문서는 “chained indexing”으로 할당을 피하는 것이 좋습니다 .


따라서 권장되는 대안은

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


답변

업데이트 : .set_value메소드가 더 이상 사용되지 않습니다 . .iat/.at안타깝게도 팬더는 문서를 거의 제공하지 않습니다.


가장 빠른 방법은 set_value를 사용하는 것 입니다. 이 방법은 방법보다 ~ 100 배 빠릅니다 .ix. 예를 들면 다음과 같습니다.

df.set_value('C', 'x', 10)


답변

다음 .loc과 같이 조건부 조회를 사용할 수도 있습니다 .

df.loc[df[<some_column_name>] == <condition>, [<another_column_name>]] = <value_to_add>

여기서 변수 <some_column_name를 확인하려는 열이 있고 추가하려는 열이 있습니다 (새 열 또는 이미 존재하는 열일 수 있음). 해당 열 / 행에 추가하려는 값입니다.<condition><another_column_name><value_to_add>

이 예제는 당면한 질문에 정확하게 작동하지 않지만 조건에 따라 특정 값을 추가하려는 경우 유용 할 수 있습니다.


답변

값을 설정하는 권장되는 방법은 (관리자에 따라) 다음과 같습니다.

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

‘체인 인덱싱'( df['x']['C'])을 사용하면 문제가 발생할 수 있습니다.

보다:


답변

사용해보십시오 df.loc[row_index,col_indexer] = value


답변

이것은 나를 위해 일한 유일한 것입니다!

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

.loc 여기에 대해 자세히 알아보십시오 .


답변

.iat/.at좋은 해결책입니다. 이 간단한 data_frame이 있다고 가정합니다.

   A   B   C
0  1   8   4
1  3   9   6
2  22 33  52

우리가 셀의 값을 수정하려면 [0,"A"]u는 그 해결책 중 하나를 사용할 수 있습니다 :

  1. df.iat[0,0] = 2
  2. df.at[0,'A'] = 2

다음은 iat셀 값을 가져오고 설정 하는 데 사용하는 전체 예제 입니다.

def prepossessing(df):
  for index in range(0,len(df)):
      df.iat[index,0] = df.iat[index,0] * 2
  return df

y_train 전 :

    0
0   54
1   15
2   15
3   8
4   31
5   63
6   11

iat각 셀의 값에 2를 곱하도록 변경 하는 사전 추정 기능을 호출 한 후 y_train :

     0
0   108
1   30
2   30
3   16
4   62
5   126
6   22