2

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

           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每个地方的总数。我觉得我在这里遗漏了一些非常明显的东西,但我看不出它是什么。有什么帮助吗?

4

2 回答 2

2

替代答案:

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

它比菲利普的答案更有效(因为一般 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

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

(如果想要枚举不同的组合,“drop_duplicates”也很有用 - 为每个组合分配一个 id - 而不仅仅是计算它们,尽管在 OP 的问题中不是这种情况)

于 2015-01-28T08:54:30.667 回答
2

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

输入:

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

输出:

place
Houston          1
New York         1
San Francisco    2
dtype: int64
于 2013-08-10T03:23:40.743 回答