根据列值将2列分组为类别

时间:2019-12-12 12:27:33

标签: python pandas

我是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']
                   })

我想将positionbrand分组在一起以构成一个类别。

输出看起来像这样:

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

如何实现第二个代码块中定义的输出?

谢谢您的建议。

1 个答案:

答案 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