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

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

4

3 回答 3

14

你是如此接近:

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
于 2013-01-09T21:42:50.420 回答
1

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

In [1]: df.groupby('one').agg(lambda x: x.str.cat(sep='|'))
Out[1]:
     two
one
1    x|y
2    y|z
3      z
于 2017-12-15T11:57:09.397 回答
1

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

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

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

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

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

进而:

df.groupby('one').agg(myfun1)
于 2019-07-09T21:50:12.530 回答