【问题标题】:python pandas custom agg functionpython pandas自定义agg函数
【发布时间】:2013-01-09 21:27:11
【问题描述】:
Dataframe:
  one two
a  1  x
b  1  y
c  2  y
d  2  z
e  3  z

grp = DataFrame.groupby('one')
grp.agg(lambda x: ???) #or equivalent function

grp.agg 的期望输出:

one two
1   x|y
2   y|z
3   z

在集成数据框之前我的 agg 函数是 "|".join(sorted(set(x)))。理想情况下,我希望组中有任意数量的列,并且 agg 为每个列项返回"|".join(sorted(set()),如上面两个。我也试过np.char.join()

爱 Pandas,它把我从一个 800 行的复杂程序带到了一个 400 行的放大公园散步。谢谢你:)

【问题讨论】:

    标签: python numpy pandas


    【解决方案1】:

    你是如此亲密:

    In [1]: df.groupby('one').agg(lambda x: "|".join(x.tolist()))
    Out[1]:
         two
    one
    1    x|y
    2    y|z
    3      z
    

    处理排序并只取集合的扩展答案:

    In [1]: df = DataFrame({'one':[1,1,2,2,3], 'two':list('xyyzz'), 'three':list('eecba')}, index=list('abcde'), columns=['one','two','three'])
    
    In [2]: df
    Out[2]:
       one two three
    a    1   x     e
    b    1   y     e
    c    2   y     c
    d    2   z     b
    e    3   z     a
    
    In [3]: df.groupby('one').agg(lambda x: "|".join(x.order().unique().tolist()))
    Out[3]:
         two three
    one
    1    x|y     e
    2    y|z   b|c
    3      z     a
    

    【讨论】:

    • 太棒了。我正在破解令人敬畏的grp2.agg(lambda x: u"|".join(sorted(set(map(str, x.tolist())))))。感谢您向我展示了真正使用数组的技巧!哪里有好的参考?再次感谢。
    • 老实说,Ipython 和对代码 sn-ps 的试验对我的理解比任何一种资源都多。但是 Wes McKinney 的 Python for Data Analysis 是一个很好的参考。
    • 自 12 月以来我一直在阅读这本书,但仍有很多要练习的地方。仅供参考,我查看了您的一些 HDF5 商店问题,我遇到了同样的灵活性问题。我使用 300 万行数据集,60 列,大量文本,MongoDB 一直是冠军。
    • 您是否介意分享一些您的 mongoDB 代码以及如何将其与 pandas 一起使用?我正在尝试确定一个一致的工作流程,以将 pandas 与非常大的数据集(但不是“大”数据)一起使用。如果你愿意,我也可以问一个适当的 SE 问题。我还想到了另一个资源:Wes 的 2012 pycon 教程。它非常彻底,帮助我巩固了几个概念。
    • 我很乐意发布它,但我认为问题格式是要走的路。看看其他人也不得不说什么会很整洁。这个周末我会有时间做公正的事情。
    【解决方案2】:

    只是对已接受答案的详细说明:

    df.groupby('one').agg(lambda x: "|".join(x.tolist()))
    

    注意df.groupby('one') 的类型是SeriesGroupBy。以及在此类型上定义的函数agg。如果你查看这个函数的文档,它会说它的输入是一个适用于 Series 的函数。这意味着上述 lambda 中的 x 类型是 Series。

    另一个注意事项是不需要将 agg 函数定义为 lambda。如果聚合函数很复杂,可以像下面这样单独定义为常规函数。唯一的限制是 x 类型应该是 Series(或与之兼容):

    def myfun1(x):
        return "|".join(x.tolist())
    

    然后:

    df.groupby('one').agg(myfun1)
    

    【讨论】:

      【解决方案3】:

      在 pandas documentation 中有更好的连接字符串的方法。
      所以我更喜欢这种方式:

      In [1]: df.groupby('one').agg(lambda x: x.str.cat(sep='|'))
      Out[1]:
           two
      one
      1    x|y
      2    y|z
      3      z
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-06-28
        • 2018-07-18
        • 1970-01-01
        • 1970-01-01
        • 2013-03-07
        • 2017-11-18
        • 1970-01-01
        相关资源
        最近更新 更多