【问题标题】:Count by unique pair of columns in pandas [duplicate]按熊猫中唯一的一对列计数[重复]
【发布时间】:2012-12-01 13:26:10
【问题描述】:

我试图弄清楚如何按每对唯一列(ip、useragent)的行数来计算,例如

d = pd.DataFrame({'ip': ['192.168.0.1', '192.168.0.1', '192.168.0.1', '192.168.0.2'], 'useragent': ['a', 'a', 'b', 'b']})

     ip              useragent
0    192.168.0.1     a
1    192.168.0.1     a
2    192.168.0.1     b
3    192.168.0.2     b

生产:

ip           useragent  
192.168.0.1  a           2
192.168.0.1  b           1
192.168.0.2  b           1

想法?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    如果你使用 groupby,你会得到你想要的。

    d.groupby(['ip', 'useragent']).size()
    

    产生:

    ip          useragent               
    192.168.0.1 a           2
                b           1
    192.168.0.2 b           1
    

    【讨论】:

    • 太好了,谢谢。错过了 groupby/count/[] 的最后一步。
    • 对我来说,这只是给AttributeError: 'DataFrame' object has no attribute 'size'
    • 这对我不起作用。我得到<class 'pandas.core.frame.DataFrame'> MultiIndex: 0 entries Empty DataFrame Pandas 15.2 版
    • 知道了:d.groupby(['ip', 'useragent']).size() 做到了 :)
    • 如果我想统计每个范围内唯一值的数量怎么办?即:在“192.28.0.1”范围内有 2 个唯一值 (a,b)。在“192.168.0.2”范围内,有 1 个唯一值,即 b。我如何编写代码来获取它?
    【解决方案2】:
    print(d.groupby(['ip', 'useragent']).size().reset_index().rename(columns={0:''}))
    

    给予:

                ip useragent   
    0  192.168.0.1         a  2
    1  192.168.0.1         b  1
    2  192.168.0.2         b  1
    

    另一个不错的选择可能是pandas.crosstab:

    print(pd.crosstab(d.ip, d.useragent) )
    print('\nsome cosmetics:')
    print(pd.crosstab(d.ip, d.useragent).reset_index().rename_axis('',axis='columns') )
    

    给予:

    useragent    a  b
    ip               
    192.168.0.1  2  1
    192.168.0.2  0  1
    
    some cosmetics:
                ip  a  b
    0  192.168.0.1  2  1
    1  192.168.0.2  0  1
    

    【讨论】:

    • 我第二次使用 groupby。我运行了一个测试,交叉表比 groupby 慢得多(例如,在我的测试中,groupby 需要 0.02 秒,而交叉表需要 2.3 秒来处理 10K 记录的数据帧)。
    • @pegah:我很惊讶!您可以简单地使用前面的 %time 魔术命令调用命令(使用 ipython)。我得到 16.5 毫秒和 18.4 毫秒的运行时间。一般来说,更具体的功能(这里是crosstab)可以预期表现更好。特别是同一个库中类似调用的 100 倍的运行时差异应该让人怀疑。您是否可能在完整的 df 上计算 crosstab 并在此之后选择一些列,而您仅在选定的列上计算分组依据?
    猜你喜欢
    • 2017-05-30
    • 2021-08-12
    • 2018-03-19
    • 1970-01-01
    • 2021-08-03
    • 2016-07-06
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多