我想说我有一个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')
但我的感觉是,可能有更好的方法。任何想法或提示?我非常感谢您的反馈!
答案 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 = ...
,其中...
是上面显示的表达式。
您应该考虑为什么要这样做。通常最好将这类信息放在一个单独的列中,而不是粉碎成字符串。