如何修改Python pandas中的重复行

时间:2015-01-06 20:41:18

标签: python pandas

我想说我有一个DataFrame(按照一些优先级标准排序)和" name"柱。很少有名称重复,我想在重复项中添加一个简单的指标。

,例如,

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

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

1 个答案:

答案 0 :(得分: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 = ...,其中...是上面显示的表达式。

您应该考虑为什么要这样做。通常最好将这类信息放在一个单独的列中,而不是粉碎成字符串。