2015-01-06 22 views
0

比方说,我有一个“name”列的DataFrame(我按照某种优先级标准排序)。很少有名字是重复的,我想给复制品添加一个简单的指示符。如何修改Python熊猫中的重复行

例如,

'jones a' 
... 
'jones a' # this should become 'jones a2' 

要获得重复的子集,我可以做

df.loc[df.duplicated(subset=['name'], take_last=True), 'name'] 

不过,我认为apply功能不允许inplace修改,对吧?所以我基本上最终做的是:

df.loc[df.duplicated(subset=['name'], take_last=True), 'name'] = \ 
df.loc[df.duplicated(subset=['name'], take_last=True), 'name'].apply(lambda x: x+'2') 

但我的感觉是,可能有更好的办法。任何想法或提示?我真的很感激你的反馈!

+0

请注意,您的解决方案仅适用于最多有一个副本。另外,你应该可以用'df.name.duplicated(take_last = True)'替换'='后的所有内容。'# – ari

回答

1

这里有一种方法:

# sample data 
d = pandas.DataFrame(
    {'Name': ['bob', 'bob', 'bob', 'bill', 'fred', 'fred', 'joe', 'larry'], 
    'ShoeShize': [8, 9, 10, 12, 14, 11, 10, 12] 
    } 
) 

>>> d.groupby('Name').Name.apply(lambda n: n + (np.arange(len(n))+1).astype(str)) 
0  bob1 
1  bob2 
2  bob3 
3  bill1 
4  fred1 
5  fred2 
6  joe1 
7 larry1 

这追加的指标对所有。如果你想指示,只有那些追加后的第一个,你可以用一点特殊的外壳做:

>>> d.groupby('Name').Name.apply(lambda n: n + np.concatenate(([''], (np.arange(len(n))+1).astype(str)[1:]))) 
0  bob 
1  bob2 
2  bob3 
3  bill 
4  fred 
5 fred2 
6  joe 
7 larry 
dtype: object 

如果你想用这个来代替原来的名称只是做d.Name = ...其中...是表达式如上所示。

你应该考虑你为什么这样做。将这类信息放在单独的列中而不是砸成字符串通常会更好。

+0

谢谢,这是一个很好的解决方案!问题是我想合并和更新来自不同来源的DataFrame。我想过要多收些“名字”,但有些消息来源只有一个名字,所以这不是一个选项。 – Sebastian