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) 속성을 주는 것이 좋아 보입니다.