iloc을 사용하여 값 설정 [닫기]


13

이 줄은 dataframe에서 처음 4 개 행을 반환 combined에 대한feature_a

combined.iloc[0:4]["feature_a"]

예상 한대로이 다음 행은 열의 데이터 프레임에서 두 번째, 네 번째 및 16 번째 행을 반환합니다 feature_a.

combined.iloc[[1,3,15]]["feature_a"]

이 행에 대한 dataframe의 제 4 개 행을 설정 feature_a하는 77.

combined.iloc[0:4]["feature_a"] = 77

이 라인은 무언가를합니다. 더 긴 목록에 적용하면 시간이 오래 걸리기 때문에 어떤 종류의 계산이 일어나고 있습니다.

combined.iloc[[1,3,15]]["feature_a"] = 88

다음으로 확인하면 2, 4, 16 행이 설정 되지 않습니다88 .

combined.iloc[[1,3,15]]["feature_a"]

대규모 코딩 우회를 수행하지 않고 데이터 프레임 열의 임의 행 목록을 값으로 설정하려면 어떻게해야합니까?

이 시나리오는 매우 간단하고 일반적이어야합니다.


이것은 프로그래밍에 대한 질문 (통계 없음)이므로 Stack Overflow
Jake Westfall

최소한의 재현 가능한 예가 없다면 이런 종류의 질문은 stackoverflow에서도 다루어지지 않을 것입니다.
Glen_b -Reinstate Monica

답변:


24

선택기를 반전시키고 먼저 열별로 선택하면 정상적으로 작동합니다.

암호:

df.feature_a.iloc[[1, 3, 15]] = 88

왜?

첫 번째 (작동하지 않는 방식)를 수행하면 데이터 프레임의 비 연속 섹션을 선택하게됩니다. 경고가 표시되어야합니다.

DataFrame의 슬라이스 복사본에 값을 설정하려고합니다. 대신 .loc [row_indexer, col_indexer] = value를 사용하십시오.

설명서의주의 사항을 참조하십시오 : http://pandas.pydata.org/pandas- > docs / stable / indexing.html # indexing-view-versus-copy

두 개의 독립적 인 작업이 수행되기 때문입니다.

  1. combined.iloc[[1,3,15]]단 3 행의 새로운 데이터 프레임을 생성하고 프레임은 반드시 복사됩니다. 그때...
  2. 를 통해 하나의 열을 선택 ["feature_a"]하지만 사본에 대해 선택됩니다.

따라서 과제는 사본으로 이동합니다. 이 문제를 해결하는 방법에는 여러 가지가 있지만이 경우 열을 먼저 선택한 다음 할당 할 열의 일부를 선택하는 것이 더 쉽고 저렴합니다.

테스트 코드 :

df = pd.DataFrame(np.zeros((20, 3)), columns=['feature_a', 'b', 'c'])
df.feature_a.iloc[[1, 3, 15]] = 88
print(df)

결과 :

    feature_a    b    c
0         0.0  0.0  0.0
1        88.0  0.0  0.0
2         0.0  0.0  0.0
3        88.0  0.0  0.0
4         0.0  0.0  0.0
5         0.0  0.0  0.0
6         0.0  0.0  0.0
7         0.0  0.0  0.0
8         0.0  0.0  0.0
9         0.0  0.0  0.0
10        0.0  0.0  0.0
11        0.0  0.0  0.0
12        0.0  0.0  0.0
13        0.0  0.0  0.0
14        0.0  0.0  0.0
15       88.0  0.0  0.0
16        0.0  0.0  0.0
17        0.0  0.0  0.0
18        0.0  0.0  0.0
19        0.0  0.0  0.0

1
이것은 효과가있을 수 있지만 왜 그렇습니까?
Matthew Drury
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.