2016-11-16 1 views
0

목록의 한 데이터 프레임에 새 열을 할당하면이 열을 다른 모든 데이터 프레임에 복사합니다. 예 :팬더 데이터 프레임 이상한 동작 목록

In [219]: a = [pd.DataFrame()]*2 
In [220]: a[0]['a'] = [1,2,3] 
In [221]: a[1] 
Out[221]: 
    a 
0 1 
1 2 
2 3 

이것은 버그입니까? 그리고 그것을 막기 위해 무엇을 할 수 있습니까?

감사합니다!

+1

당신이'[] * n'와 목록을 초기화 할 때 동작을 알려져 :

그냥 목록을 인스턴스화하는 또 다른 방법을 사용하십시오 상황에서 그것을 방지하기 위해. 목록을 초기화하려면'a = [pdf (i) for range (2)]'를 사용하십시오. – Psidom

+0

감사합니다 Psidom! 호기심에서 왜 이런 일이 일어 났는지 알 수 있습니까? –

+1

[ "최소한의 놀음"및 변경 가능 기본 인수] 가능한 복제본 (http://stackoverflow.com/questions/1132941/least-astonishment-and-the-mutable-default-argument) – Boud

답변

-1

편집 : 지금 답장이에 대한 설명이있는 것을 볼 수^

나는이 아직 의해 발생 이해하지 않지만, 당신이 별도로 dataframes을 정의하여 주위 얻을 수 있습니다 목록에 넣기 전에.

In [2]: df1 = pd.DataFrame() 
In [3]: df2 = pd.DataFrame() 
In [4]: a = [df1, df2] 
In [5]: a[0]['a'] = [1,2,3] 
In [6]: a[0] 
Out[6]: 
    a 
0 1 
1 2 
2 3 

In [7]: a[1] 
Out[7]: 
Empty DataFrame 
Columns: [] 
Index: [] 
0

대답은 당신 때문에 당신은 각 항목이 같은 무언가 목록으로 끝낼 그 구문

x = [something]*n 

으로 목록을 정의 할 때. 그것은 같은 객체를 참조, 복사본을 생성하지 않습니다

>>> import pandas as pd 
>>> a=pd.DataFrame() 
>>> g=[a]*2 
>>> g 
1: [Empty DataFrame 
Columns: [] 
Index: [], Empty DataFrame 
Columns: [] 
Index: []] 
>>> id(g[0]) 
4: 129264216L 
>>> id(g[1]) 
5: 129264216L 

코멘트는을 통해 읽고 grok 수 할 몇 가지 유용한 예제를 가리키는.

>>> map(lambda x: pd.DataFrame(),range(2)) 
6: [Empty DataFrame 
Columns: [] 
Index: [], Empty DataFrame 
Columns: [] 
Index: []] 
>>> [pd.DataFrame() for i in range(2)] 
7: [Empty DataFrame 
Columns: [] 
Index: [], Empty DataFrame 
Columns: [] 
Index: []] 
>>>