Pandas, 중복 행네임시 rename 과 insert 다른 동작

data={'COL1':['A','B','C','D'],'COL2':['1','2','3','4']}
df1 = pd.DataFrame(data)
try:
    df1.insert(1,'COL1',df1['COL2'])
except Exception as e:
    print(e) 
    df1=df1.rename(columns={'COL2':'COL1'})
print(df1)
print("#############################")
df1 = pd.DataFrame(data)
df1.insert(1,'COL1',df1['COL2'],allow_duplicates=True)
print(df1)
print("##############################")
df1 = pd.DataFrame(data).set_flags(allows_duplicate_labels=False)

try:
    df1=df1.rename(columns={'COL2':'COL1'})
except Exception as e:
    print("ERROR:",e) 
print(df1)

위 코드를 동작 시키면 아래와 같이 출력 됩니다.

cannot insert COL1, already exists  <==== insert 시 이름이 중복이라고 에러가 남. 
그러나 rename 은 동작해서 아래와 같이 COL1 이 출력됨.
  COL1 COL1
0    A    1
1    B    2
2    C    3
3    D    4
#############################
insert 시 allow_duplicates=True를 주면 동일한 이름의 column이 들어감
  COL1 COL1 COL2
0    A    1    1
1    B    2    2
2    C    3    3
3    D    4    4
##############################
Dataframe 의 속성을 duplicate를 false로 설정하면 rename 시에도 중복으로 에러가 발생함.
ERROR: Index has duplicates.
      positions
label          
COL1     [0, 1]
  COL1 COL2
0    A    1
1    B    2
2    C    3
3    D    4

여기서 이상한 점은 dataframe 의 속성이 중복 허용이어도 insert는 다르게 동작 한다는 것이다. pandas/flags.py at bedd8f0170b5ff6cd0bab0e40f9bc5b95f6e1eec · pandas-dev/pandas (github.com) 이 코드를 보면
“allows_duplicate_labels : bool, default True” .. dataframe 의 기본값은 True이다. 즉 중복을 허용한다. 그러나 pandas/frame.py at main · pandas-dev/pandas (github.com) 의 insert 함수를 보면 이 값은 false 입니다. 즉 insert 의 경우 좀더 강하게 중복에 대해서 재 검증을 하고 있습니다.

pandas 의 column이 많아 지게 되면, rename 도 이름을 중복하는 실수를 할 수도 있습니다. dataframe 의 중복기본값이 왜 ‘허용’인지는 의문이나, 안전하게 하려면 dataframe 생성시 기본적으로 .set_flags(allows_duplicate_labels=False) 속성을 주는 것이 좋아 보입니다.

Leave a Reply

Your email address will not be published. Required fields are marked *