如何根据熊猫中其他两列的唯一组合获得两列的唯一计数

时间:2021-05-10 17:20:43

标签: python pandas

这是this

的后续问题

假设我有这个数据集:

dff = pd.DataFrame(np.array([["2020-11-13",3,4, 0,0], ["2020-10-11", 3,4,0,1], ["2020-11-13", 1,4,1,1],
                         ["2020-11-14", 3,4,0,0], ["2020-11-13", 5,4,0,1], 
                         ["2020-11-14", 2,4,1,1],["2020-11-12", 1,4,0,1],["2020-11-14", 2,4,0,1],["2020-11-15", 5,4,1,1],
                         ["2020-11-11", 1,2,0,0],["2020-11-15", 1,2,0,1],
                         ["2020-11-18", 2,4,0,1],["2020-11-17", 1,2,0,0],["2020-11-20", 3,4,0,0]]), columns=['Timestamp', 'Name', "slot", "A", "B"])

我想对每个 Nameslot 组合进行计数,但忽略 AB 的相同组合的多个时间序列值。例如,如果我只是按 Nameslot 分组,我会得到:

dff.groupby(['Name', "slot"]).Timestamp.count().reset_index(name="count")


  Name slot count
    1   2   3
    1   4   2
    2   4   3
    3   4   4
    5   4   2

但是,对于 A == 0 && B == 0name == 1slot == 2 有两种组合,因此我希望计数为 3 而不是 2。< /p>

这是我最想要的桌子。

  Name slot count
    1   2   2
    1   4   2
    2   4   2
    3   4   2
    5   4   2

我试过了:

filter_one = dff.groupby(['A','B']).Timestamp.transform(min)
dff1 = dff.loc[dff.Timestamp == filter_one]
dff1.groupby(['Name', "slot"]).Timestamp.count().reset_index(name="count")

但这给了我:

  Name slot count
    1   2   1
    1   4   1
    3   4   1

如果我删除 AB 的重复项,它也不起作用。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,您可能只需要在分组之前根据 grouper 列与 A 和 B 的组合删除重复项:

u = dff.drop_duplicates(['Name','slot','A','B'])
u.groupby(['Name', "slot"]).Timestamp.count().reset_index(name="count")

  Name slot  count
0    1    2      2
1    1    4      2
2    2    4      2
3    3    4      2
4    5    4      2