如何修改 Python pandas 中的重复行

How to modify duplicated rows in Python pandas

假设我有一个带有“name”列的 DataFrame(我按某些优先级标准排序)。很少有重复的名字,我想在重复的名字上附加一个简单的指标。

例如,

'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')

但我的感觉是可能有更好的方法。有什么想法或提示吗?非常感谢您的反馈!

这是一种方法:

# 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 = ...,其中 ... 是上面显示的表达式。

你应该想想你为什么要这样做。将此类信息放在单独的列中通常比粉碎成一个字符串更好。