2015-05-29 60 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