2013-04-30 5 views
4

팬더 데이터 프레임을 만들 때 제공되는 사전을 복사하지 않도록하려면 어떻게해야합니까?복사하지 않고 팬더 데이터 프레임

>>> a = np.arange(10) 
>>> b = np.arange(10.0) 
>>> df1 = pd.DataFrame(a) 
>>> a[0] = 100 
>>> df1 
    0 
0 100 
1 1 
2 2 
3 3 
4 4 
5 5 
6 6 
7 7 
8 8 
9 9 
>>> d = {'a':a, 'b':b} 
>>> df2 = pd.DataFrame(d) 
>>> a[1] = 200 
>>> d 
{'a': array([100, 200, 2, 3, 4, 5, 6, 7, 8, 9]), 'b': array([ 0., 1., 2., 3., 4., 5., 6., 7., 8., 9.])} 
>>> df2 
    a b 
0 100 0 
1 1 1 
2 2 2 
3 3 3 
4 4 4 
5 5 5 
6 6 6 
7 7 7 
8 8 8 
9 9 9 

만약 내가 데이터 프레임을 만든다면,에 대한 변경 사항은 df에 반영됩니다 (그 반대의 경우도 마찬가지입니다).

사전을 제공 할 때이 방법을 사용할 수 있습니까?

+2

전적으로 * 실현하지 못했습니다. –

답변

3

dict을 '공유'하고 dict 변경 내용을 기반으로 프레임을 업데이트 할 방법이 없습니다. copy 인수는 dict와 관련이 없으며, 데이터가 인 경우 항상이 복사됩니다. ndarray로 변환 되었기 때문입니다.

그러나 제한된 방식으로 이러한 유형의 동적 동작을 얻는 방법이 있습니다.

In [9]: arr = np.array(np.random.rand(5,2)) 

In [10]: df = DataFrame(arr) 

In [11]: arr[0,0] = 0 

In [12]: df 
Out[12]: 
      0   1 
0 0.000000 0.192056 
1 0.847185 0.609028 
2 0.833997 0.422521 
3 0.937638 0.711856 
4 0.047569 0.033282 

따라서 전달 된 ndarray는 기본 numpy 배열에 대한보기가됩니다. DataFrame에서 작업하는 방법에 따라 복사본을 트리거 할 수 있습니다 (예 : 새 열을 지정하거나 dtype 열을 변경 한 경우). 이것은 또한 하나의 dtyped 프레임에 대해서만 작동합니다.

0

이며 데이터를 복사하지 않고 데이터 프레임을 초기화 할 수 있습니다. 방법을 이해하려면 DataFrame에서 사용되는 기본 데이터 구조 인 BlockManager를 이해해야합니다. 동일한 dtype의 데이터를 함께 그룹화하고 메모리를 단일 블록에 보관합니다. 데이터가 이미 하나의 블록으로 제공되는 경우, 예를 들어,이 행렬에서 초기화 :

 a = np.zeros((100,20)) 
     a.flags['WRITEABLE'] = False 
     df = pd.DataFrame(a, copy=False) 
     assert_read_only(df[df.columns[0]].iloc) 

는 ... 다음 DataFrame 보통 단지 ndarray를 참조 할 수있다.

여러 어레이로 시작하거나 이종 유형이있는 경우에는 분명히 작동하지 않습니다. 어떤 경우에는 monkey patch the BlockManager을 사용하여 다른 유형의 데이터를 통합하지 않도록 할 수 있습니다.