计算熊猫中的唯一值对

时间:2013-08-10 02:23:06

标签: python pandas

我有一个如下所示的数据框:

           place          user     count  item
2013-06-01 New York       john     2      book
2013-06-01 New York       john     1      potato
2013-06-04 San Francisco  john     5      laptop
2013-06-04 San Francisco  jane     6      tape player
2013-05-02 Houston        michael  2      computer

我正在尝试计算每个(date, user)的唯一place组合的数量 - 或换句话说,每个城市的“唯一身份访问次数”。因此对于 New York它将是一个,San Francisco它将是两个,而Houston它将是一个。

我尝试过以下操作:

df.groupby([df.index, user, place]).place.size()但这只返回每个地方的总count。我觉得我错过了一些非常明显的东西,但我看不出它是什么。有什么帮助吗?

2 个答案:

答案 0 :(得分:2)

这是一种方法,假设您将索引转换为名为date的列,但您也可以像上面显示的那样传递它。

输入:

df.groupby(['place', 'user', 'date']).place.count().groupby(level='place').count()

输出:

place
Houston          1
New York         1
San Francisco    2
dtype: int64

答案 1 :(得分:2)

替代答案:

df.drop_duplicates(['date', 'place', 'user'])['place'].value_counts()

它比Phillip的回答更有效率(因为通常groupby不是):

In [64]: %timeit df.groupby(['place', 'user', 'date']).place.count().groupby(level='place').count()
100 loops, best of 3: 2.55 ms per loop

In [65]: %timeit df.drop_duplicates(['date', 'place', 'user'])['place'].value_counts()
1000 loops, best of 3: 1.27 ms per loop

(在上面连续10000次的DataFame上计算的数字)。

(" drop_duplicates"如果想要枚举不同的组合也是有用的 - 为每个组合分配一个id - 而不是仅计算它们,尽管在OP的问题中并非如此)