【问题标题】:Row-wise unions in pandas groupbypandas groupby 中的逐行联合
【发布时间】:2014-07-30 03:00:11
【问题描述】:

我有一个看起来像这样的大数据框(并且可以使用 df=pd.read_clipboard(sep='\s\s+') 复制粘贴:

    user_nm    month    unique_ips  shifted_ips     halves  quarters    mo_pairs
    100118231   2   set([142.136])  set([])         h1  q1  p1
    100118231   3   set([142.136])  set([142.136])  h1  q1  p2
    100118231   6   set([108.0])    set([142.136])  h1  q2  p3
    100118231   7   set([108.0])    set([108.0])    h2  q3  p4
    100118231   8   set([142.136])  set([108.0])    h2  q3  p4
    100118231   9   set([142.136])  set([142.136])  h2  q3  p5
    100118231   10  set([142.136])  set([142.136])  h2  q4  p5
    100118231   11  set([142.136])  set([142.136])  h2  q4  p6
    100406016   3   set([50.192])   set([])         h1  q1  p2
    100406016   7   set([50.192])   set([50.192])   h2  q3  p4

对于每个用户,我想按halves(或quarters,或mo_pairs)分组,并得到unique_ipsshifted_ips 的联合。

我可以像这样按字段分组:

In [265]: a=df.groupby(['user_nm','halves'])

In [266]: a.head()
Out[266]: 

            user_nm month   unique_ips  shifted_ips halves  quarters    mo_pairs
user_nm halves                              
100118231   h1  0   100118231   2   set([142.136])  set([]) h1  q1  p1
        1   100118231   3   set([142.136])  set([142.136])  h1  q1  p2
        2   100118231   6   set([108.0])    set([142.136])  h1  q2  p3
    h2  3   100118231   7   set([108.0])    set([108.0])    h2  q3  p4
        4   100118231   8   set([142.136])  set([108.0])    h2  q3  p4
        5   100118231   9   set([142.136])  set([142.136])  h2  q3  p5
        6   100118231   10  set([142.136])  set([142.136])  h2  q4  p5
        7   100118231   11  set([142.136])  set([142.136])  h2  q4  p6
100406016   h1  8   100406016   3   set([50.192])   set([]) h1  q1  p2
    h2  9   100406016   7   set([50.192])   set([50.192])   h2  q3  p4

但是,当我尝试合并这些行时,出现错误:

In [267]: a.apply(lambda x: x[2] & x[3], axis=1)
TypeError: <lambda>() got an unexpected keyword argument 'axis'

理想情况下,我想要这样的东西:

                  unique_ips    shifted_ips
user_nm   halves        
100118231   h1  set([142.136, 108.0])   set([142.136])
100118231   h2  set([142.136,108.0])    set([142.136,108.0])
100406016   h1  set([50.192])           set([])
100406016   h2  set([50.192])           set([50.192])

我也尝试过set_index,但这并没有对数据框进行适当的分组

b=df.set_index(['user_nm','halves'])

这似乎是一个相对简单的任务,我错过了什么?

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    对此的简短回答是您需要使用aggregate 方法同时减少groupyby 对象Pandas GroupBy Aggregate

    现在下面的 sn-p 应该可以解决你的问题

    在阅读时正确处理集合:元素以str 而非set 的形式出现

    df.unique_ips = df.unique_ips.apply(eval)
    df.shifted_ips = df.shifted_ips.apply(eval)
    

    进行分组

    grouped = df.groupby(['user_nm', 'halves'])
    my_lambda = lambda x: reduce(set.union, x)
    output = grouped.aggregate({'unique_ips': my_lambda,
                                'shifted_ips': my_lambda})
    

    结果是:

                                 unique_ips            shifted_ips
    user_nm   halves                                              
    100118231 h1      set([142.136, 108.0])         set([142.136])
              h2      set([142.136, 108.0])  set([142.136, 108.0])
    100406016 h1              set([50.192])                set([])
              h2              set([50.192])          set([50.192])
    

    【讨论】:

    • 谢谢你,我知道我做的比它需要的更难。为我返回文档,感谢您的链接。
    • 很好的解决方案,对于 Python 3,您需要导入 reduce:from functools import reduce
    猜你喜欢
    • 2019-01-26
    • 2013-07-24
    • 2015-11-27
    • 2014-11-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多