我试图计算几个组的行号,只有当当前行的分类值与以前的。
我在考虑计算每个组的布尔级数,然后调用cumsum()
,这将给予我所需要的(尽管我毫不怀疑可能有更好的方法)。
我的测试数据集看起来像:
df = pd.DataFrame({
"id_1": [1, 1, 1, 2, 2, 2, 2, 2, 2],
"id_2": ["a", "a", "a", "a", "a", "a", "b", "b", "b"],
"class_1": [1, 1, 1, 1, 1, 1, 2, 1, 2],
"class_2": [1, 1, 2, 1, 2, 2, 2, 1, 2]
})
| id_1| id_2| class_1|二级|
| --|--|--|--|
| 1 |一| 1 | 1 |
| 1 |一| 1 | 1 |
| 1 |一| 1 | 2 |
| 2 |一| 1 | 1 |
| 2 |一| 1 | 2 |
| 2 |一| 1 | 2 |
| 2 |B| 2 | 2 |
| 2 |B| 1 | 1 |
| 2 |B| 2 | 2 |
我想对id
列进行分组并比较classification
列。
到目前为止,我有:
df["t_id"] = df.groupby(['id_1', 'id_2'], as_index=False)['class_1'].apply(lambda x: (x != x.shift()).cumsum())
df
这将产生如下所示的正确输出:
| id_1| id_2| class_1|二级|t_id|
| --|--|--|--|--|
| 1 |一| 1 | 1 | 1 |
| 1 |一| 1 | 1 | 1 |
| 1 |一| 1 | 2 | 1 |
| 2 |一| 1 | 1 | 1 |
| 2 |一| 1 | 2 | 1 |
| 2 |一| 1 | 2 | 1 |
| 2 |B| 2 | 2 | 1 |
| 2 |B| 1 | 1 | 2 |
| 2 |B| 2 | 2 | 3 |
但是,这只会将class_1
列中的每个值与前一行的值进行比较。我无法理解如何将class_2
作为比较的一部分。我希望它会像下面这样,但唉,这不工作!
df["t_id"] = df.groupby(["id_1", "id_2"], as_index=False)["class_1", "class_2"].apply(lambda x: ((x["class_1"] != x["class_2"].shift()) or (x["class_2"] != x["class_2"].shift())).cumsum())
df
下面是我在考虑class_
和class_2
列时所期望的结果:
| id_1| id_2| class_1|二级|t_id|
| --|--|--|--|--|
| 1 |一| 1 | 1 | 1 |
| 1 |一| 1 | 1 | 1 |
| 1 |一| 1 | 2 | 2 |
| 2 |一| 1 | 1 | 1 |
| 2 |一| 1 | 2 | 2 |
| 2 |一| 1 | 2 | 2 |
| 2 |B| 2 | 2 | 1 |
| 2 |B| 1 | 1 | 2 |
| 2 |B| 2 | 2 | 3 |
我使用Python 1.8和Pandas 1.5.3(尽管我可能需要针对Pandas 0.22.1)。
建议欢迎。先谢了。
2条答案
按热度按时间g6baxovj1#
我相信有几种方法可以做到这一点,但要修复您采用的方法,而不是
x["class_2"].shift()
,您需要执行x.shift()["class_2"]
:输出量:
jk9hmnmh2#
另一个解决方案:比较由多个列组成的元组:
图纸: