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())上記の 2 つのように列ごとに項目を返します。私も試し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

受け入れられた答えの詳細:

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

df.groupby('one')の型が であることに注意してくださいSeriesGroupBy。そして、aggこの型で定義された関数。この関数のドキュメントを確認すると、その入力はシリーズで機能する関数であると書かれています。これはx、上記のラムダの型が Series であることを意味します。

もう 1 つの注意点は、agg 関数をラムダとして定義する必要がないことです。集計関数が複雑な場合は、以下のように通常の関数として別途定義できます。唯一の制約は、 x 型が Series である (またはそれと互換性がある) ことです。

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

その後:

df.groupby('one').agg(myfun1)
于 2019-07-09T21:50:12.530 に答える
1

パンダのドキュメントには、文字列を連結するためのより良い方法があります。
だから私はこの方法を好みます:

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 に答える