python pandas自定义agg功能

时间:2013-01-09 21:27:11

标签: python numpy pandas

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()

爱熊猫,它带我从一个800线复杂的程序到一个400线的公园里放大。谢谢:))

3 个答案:

答案 0 :(得分:12)

你是如此亲密:

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

答案 1 :(得分:1)

有一种更好的方法可以在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

答案 2 :(得分:0)

仅详细说明接受的答案:

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)