사이에는 매우 큰 차이가 있습니다 series.iloc[:]
series[:]
다시 할당 할 때 와와 ( 있습니다. (i)loc
할당하려는 항목이 양수인의 색인과 일치하는지 항상 확인합니다. 한편, [:]
구문은 인덱스 정렬을 무시하고 기본 NumPy 배열에 할당합니다.
s = pd.Series(index=[0, 1, 2, 3], dtype='float')
s
0 NaN
1 NaN
2 NaN
3 NaN
dtype: float64
# Let's get a reference to the underlying array with `copy=False`
arr = s.to_numpy(copy=False)
arr
# array([nan, nan, nan, nan])
# Reassign using slicing syntax
s[:] = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])
s
0 1
1 2
2 3
3 4
dtype: int64
arr
# array([1., 2., 3., 4.]) # underlying array has changed
# Now, reassign again with `iloc`
s.iloc[:] = pd.Series([5, 6, 7, 8], index=[3, 4, 5, 6])
s
0 NaN
1 NaN
2 NaN
3 5.0
dtype: float64
arr
# array([1., 2., 3., 4.]) # `iloc` created a new array for the series
# during reassignment leaving this unchanged
s.to_numpy(copy=False) # the new underlying array, for reference
# array([nan, nan, nan, 5.])
차이점을 이해 했으므로 코드에서 어떤 일이 발생하는지 살펴 보겠습니다. 루프의 RHS를 인쇄하여 할당 대상을 확인하십시오.
for i in range(2):
print(a_df.iloc[0, i*4:(i+1)*4])
# output - first row
0 1
1 2
2 3
3 4
Name: 0, dtype: int64
# second row. Notice the index is different
4 5
5 6
6 7
7 8
Name: 0, dtype: int64
b_df.iloc[i, :]
두 번째 반복에서 할당 할 때 인덱스가 다르므로 할당 된 것이 없으며 NaN 만 표시됩니다. 그러나 변경 b_df.iloc[i, :]
하려면 b_df.iloc[i][:]
색인 정렬이 바이 패스 있도록, 기본 NumPy와 배열에 할당 의미합니다. 이 작업은 다음과 같이 더 잘 표현됩니다.
for i in range(2):
b_df.iloc[i, :] = a_df.iloc[0, i*4:(i+1)*4].to_numpy()
b_df
0 1 2 3
0 1 2 3 4
1 5 6 7 8
또한 이것이 일종의 체인 할당이라는 것을 언급 할 가치 가 있으며, 이는 좋은 일이 아니며 코드를 읽고 이해하기 어렵게 만듭니다.
b_df.iloc[1] = a_df.iloc[0, 4:8]
index[4, 5, 6, 7]
가 있는 시리즈를 index 가있는 시리즈에 할당합니다[0, 1, 2, 3]
. 오버랩이 없으므로NaN
모든 요소에 할당됩니다. 이 시점까지는 나에게 의미가 있습니다. 그러나 당신처럼 나는 이유에 불분명 오전b_df.iloc[1][:] = ...
동작합니다이 개체를 다른-검사b_df.iloc[1]
와b_df.iloc[1][:]
인덱스 사이의 차이를 알 수 없습니다. 필자의 가장 좋은 추측은 사본 ([:]
)에 직접 할당 하는 것이 팬더에 의해 특별한 경우로 간주되어 양수인의 색인을 무시 하고이 불일치를 만드는 것입니다.