나는 loc
이 slowier는 나의 실험에서 생각하고 다른 인덱스 slowiest 새로운 Series
정렬 :
그러나 다른 컬럼의 데이터가 어디에 유지, 또는 필요 수 있을지 몰라 때로는 움직일 수 있습니다.
데이터가 이동되지 않고 새로운 열이 끝에 추가됩니다 (어쩌면 예외가있을 수 있지만 그것에 대해 알 수는 없습니다).
# using pandas 0.18.1, python 3.5
import pandas as pd
#len(df) = 10m
df = pd.DataFrame({'a': range(10000000)})
b = pd.Series(range(10000000))
c = pd.Series(range(10000000), index=df.index)
df['b'] = b
df.loc[:, 'c'] = b
df['d'] = c
df.loc[:, 'e'] = c
print (df)
In [36]: %timeit df['b'] = b
10 loops, best of 3: 23.5 ms per loop
In [37]: %timeit df.loc[:, 'c'] = b
The slowest run took 5.76 times longer than the fastest. This could mean that an intermediate result is being cached.
1 loop, best of 3: 40 ms per loop
In [38]: %timeit df['d'] = c
10 loops, best of 3: 22.3 ms per loop
In [39]: %timeit df.loc[:, 'e'] = c
10 loops, best of 3: 39.5 ms per loop
그러나 index
변경하는 경우 : 새 행을 추가하는 경우
# using pandas 0.18.1, python 3.5
import pandas as pd
df = pd.DataFrame({'a': range(10000000)})
df.index = df.index + 15
b = pd.Series(range(10000000))
c = pd.Series(range(10000000), index=df.index)
df['b'] = b
df.loc[:, 'c'] = b
df['d'] = c
df.loc[:, 'e'] = c
print (df)
In [41]: %timeit df['b'] = b
1 loop, best of 3: 656 ms per loop
In [42]: %timeit df.loc[:, 'c'] = b
1 loop, best of 3: 735 ms per loop
In [43]: %timeit df['d'] = c
10 loops, best of 3: 22.4 ms per loop
In [44]: %timeit df.loc[:, 'e'] = c
10 loops, best of 3: 56.6 ms per loop
, 그것은 빠르고, 내 생각은 Series
의 길이 따라 달라
In [68]: %timeit df.loc[10000015, :] = pd.Series([1,2,3,2,4], index=df.columns)
1000 loops, best of 3: 274 µs per loop
그러나 경우에하는 것은 많은 행을 추가, 그것은 비싸고 이것이 피할 수 있다고 생각합니다.
'numpy' 배열 (대부분의 팬더에 대한 기본 구조)로'concatenate'는 더 큰 새로운 배열을 만들고 모든 값을 (상대 크기에 관계없이) 복사하는 것입니다. 팬더 문제에서 언급 한 복사 작업은 하나의 열 추가 또는 여러 열 추가에 적용됩니다. 반복적으로 수행하는 경우 비용이 훨씬 많이 듭니다. – hpaulj
@hpaulj 그렇다면 왜 DF에 행을 추가하는 것을 피하기 위해 문서 및 다양한 판다에 글을 올렸지 만 열 추가에 대한 언급은 없었습니까? – max
데이터 프레임이 2 차원 배열 인 경우 열 추가는 행 추가만큼 비용이 많이 듭니다. Dito는 열이 구조화 된 배열의'fields '인 경우에 사용됩니다. 그러나 DF는 1 차원 배열 (열)의 목록이며 열을 추가하는 것이 더 쉬울 것입니다. – hpaulj