Pandas分组和添加计数唯一值作为新列

4

问题

我正在尝试按列daysource对Pandas DataFrame进行分组,然后对每个组计算第三个(timestamp)的唯一实例数(以查找每个源每天获得了多少点击量),但是我遇到了这个错误(完整的traceback如下): TypeError: 'method' object is not subscriptable

尝试

我的代码是:

df['timestamp_count'] = df.groupby(["source", "day"]).agg({"timestamp": "nunique"})

理想情况下,我希望得到这样的结果(包括新列timestamp_count):

day    source    timestamp                timestamp_count
1      facebook  2018-08-04 11:16:32.416  2
1      facebook  2019-01-03 10:25:38.216  2
1      twitter   2018-10-14 13:26:22.123  1
2      facebook  2019-01-30 12:16:32.416  1

当我运行df.describe()时,我看到source是一个对象,但day是一个整数。这可能是问题的一部分吗?看了其他问题后,似乎很有可能是这方面的问题,但没有一个问题会抛出相同的输入/错误组合。
有谁能帮助 Python 新手吗?非常感谢!

Traceback

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-90-db5a002137ca> in <module>
----> 1 df['timestamp_count'] = (df.groupby["source", 
"day"]).agg({"timestamp": "nunique"})

TypeError: 'method' object is not subscriptable

请提供完整的回溯(其中也包括导致错误的行)。谢谢。 - cs95
谢谢@coldspeed,我已经完成了。 - FPL
应该是 df.groupby(["source", "day"]),而不是 (df.groupby["day", "source"])。你在帖子中已经修正了拼写错误,但没有意识到代码中也有错误。 - cs95
好的,已经修复了。@coldspeed - FPL
1个回答

9

使用 transform 来广播结果:

df['timestamp_count'] = (
    df.groupby(["source", "day"])['timestamp'].transform('nunique'))
df

   day    source                timestamp  timestamp_count
0    1  facebook  2018-08-04 11:16:32.416                2
1    1  facebook  2019-01-03 10:25:38.216                2
2    1   twitter  2018-10-14 13:26:22.123                1
3    2  facebook  2019-01-30 12:16:32.416                1

谢谢!我已经得到一个新的timestamp_count列作为datetime对象,你有把它转成整数的技巧吗? - FPL
@FPL df.groupby(["source", "day"])['timestamp'].transform('nunique') 返回一个整数列。请再检查一遍。 - cs95
我已经检查并重新运行了所有内容,但仍然得到日期时间 :-((df.info() 返回“timestamp_count 143375 non-null datetime64[ns]”) - FPL
@FPL 如果你这样做 df['timestamp_count'] = df.groupby(["source", "day"])['timestamp'].transform('nunique').astype(int),会怎么样呢?你能为我打印出 df['timestamp_count'].head().tolist() 吗? - cs95
太好了!非常感谢你的帮助!我不确定在哪里添加这个函数...对这一切还是很新。 - FPL

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接