我是Python和Pandas的新手。
我的DataFrame看起来像这样:
df = pd.DataFrame({'ID': ['a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'c', 'c', 'c', 'd', 'd', 'd'],
'Position': ['0', '1', '2', '3', '4', '0', '1', '2', '3', '0', '1', '2', '0', '1', '2'],
'Brand': ['Mazda', 'BMW', 'Ford', 'Fiat', 'Dodge', 'Mazda', 'BMW', 'Ford', 'Fiat', 'BMW', 'Ford', 'Fiat', 'BMW', 'Ford', 'Fiat']
})
我想将position
和brand
分组在一起以构成一个类别。
输出看起来像这样:
ID Group
a 1
b 2
c 3
d 3
因为第1组是:
0 Mazda
1 BMW
2 Ford
3 Fiat
4 Dodge
并且c
= d
是因为他们俩都以相同的顺序拥有相同的护理人员,所以组别相同-3:
0 BMW
1 Ford
2 Fiat
如果d
具有由列position
定义的不同顺序,则它将是不同的类别:
0 Fiat
1 BWM
2 Ford
如何实现第二个代码块中定义的输出?
谢谢您的建议。
答案 0 :(得分:2)
您可以使用head
过滤器来区分每组相同的前3行,然后转换为元组,然后使用Series.factorize
:
s = (df.groupby(['ID'], sort=False)['Position','Brand']
.apply(lambda x: tuple(x.head(3).values.ravel())))
df = pd.DataFrame({'ID':s.index, 'Cat':pd.factorize(s)[0] + 1})
print (df)
ID Cat
0 a 1
1 b 1
2 c 2
3 d 2