我有一个如下所示的数据框:
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
。我觉得我错过了一些非常明显的东西,但我看不出它是什么。有什么帮助吗?
答案 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的问题中并非如此)