2015-05-29 1809 views
0

爲什麼當我重新命名列時,如果新列名已經存在,pandas.DataFrame對象不會抱怨?當pandas列重命名時創建列名重複時該怎麼辦

這使得將來引用新的列會返回一個pandas.DataFrame,而不是pandas.Series,這可能會導致更多的錯誤。

其次,有沒有一種建議的方式來處理這種情況?

例子:

import pandas 

df = pd.DataFrame({'A' : ['foo','bar'] ,'B' : ['bar','foo'] }) 
df.B.map({'bar':'foo','foo':'bar'}) 
# 0 foo 
# 1 bar 
# Name: B, dtype: object 

df.rename(columns={'A':'B'},inplace=True) 

現在,下面將失敗:

df.B.map({'bar':'foo','foo':'bar'}) 
#AttributeError: 'DataFrame' object has no attribute 'map' 
+1

那麼你可能只是測試新的名稱是否已存在於您的DF重命名像'd之前= {'A':'B'} if if df.columns.isin(d.values())。any()== False:df,rename(columns = d,inplace = True)' – EdChum

回答

1

比方說你有一個字典映射老列到新的列名。當重命名你的數據框,你可以使用字典解析來測試新的價值v已經在數據幀:

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]}) 
d = {'a': 'B', 'b': 'B'} 
df.rename(columns={k: v for k, v in d.iteritems() if v not in df}, inplace=True) 
>>> df 
    a B 
0 1 3 
1 2 4 

df = pd.DataFrame({'a': [1, 2], 'b': [3, 4]}) 
d = {'a': 'b'} 
df.rename(columns={k: v for k, v in d.iteritems() if v not in df}, inplace=True) 
>>> df 
    a b 
0 1 3 
1 2 4