我有一个数据框:
>>> df
A
0 foo
1 bar
2 foo
3 baz
4 foo
5 bar
我需要找到所有重复的组并用连续的 dgroup_id
标记它们:
>>> df
A dgroup_id
0 foo 1
1 bar 2
2 foo 1
3 baz
4 foo 1
5 bar 2
(意思是foo
属于第一组重复,bar
属于第二组重复,baz
不重复.)
我这样做了:
import pandas as pd
df = pd.DataFrame({'A': ('foo', 'bar', 'foo', 'baz', 'foo', 'bar')})
duplicates = df.groupby('A').size()
duplicates = duplicates[duplicates>1]
# Yes, this is ugly, but I didn't know how to do it otherwise:
duplicates[duplicates.reset_index().index] = duplicates.reset_index().index
df.insert(1, 'dgroup_id', df['A'].map(duplicates))
这导致:
>>> df
A dgroup_id
0 foo 1.0
1 bar 0.0
2 foo 1.0
3 baz NaN
4 foo 1.0
5 bar 0.0
有没有更简单/更短的方法来在 Pandas 中实现这一点?我读到也许 pandas.factorize
在这里可以提供帮助,但我不知道如何使用它...(此功能上的 pandas documentation 没有帮助)
此外:我不介意从 0 开始的组计数,也不介意奇怪的排序顺序;但我希望 dgroup_id
为整数,而不是 float 。
最佳答案
您可以通过 get_duplicates()
制作重复项的 list
然后通过 A
设置 dgroup_id
索引
def find_index(string):
if string in duplicates:
return duplicates.index(string)+1
else:
return 0
df = pd.DataFrame({'A': ('foo', 'bar', 'foo', 'baz', 'foo', 'bar')})
duplicates = df.set_index('A').index.get_duplicates()
df['dgroup_id'] = df['A'].apply(find_index)
df
输出:
A dgroup_id 0 foo 2 1 bar 1 2 foo 2 3 baz 0 4 foo 2 5 bar 1
关于python - 如何标记 Pandas 中的重复组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44985154/