134

次のようなデータフレームがあります。

   A         B       C
0  1  0.749065    This
1  2  0.301084      is
2  3  0.463468       a
3  4  0.643961  random
4  1  0.866521  string
5  2  0.120737       !

通話中

In [10]: print df.groupby("A")["B"].sum()

戻ります

A
1    1.615586
2    0.421821
3    0.463468
4    0.643961

ここで、列「C」に対して「同じ」ことをしたいと思います。その列には文字列が含まれているため、sum() は機能しません (ただし、文字列を連結すると思うかもしれません)。私が本当に見たいのは、各グループの文字列のリストまたはセットです。

A
1    {This, string}
2    {is, !}
3    {a}
4    {random}

私はこれを行う方法を見つけようとしています。

Series.unique() ( http://pandas.pydata.org/pandas-docs/stable/generated/pandas.Series.unique.html ) は機能しませんが、

df.groupby("A")["B"]

です

pandas.core.groupby.SeriesGroupBy object

だから私はシリーズの方法がうまくいくことを望んでいました。何か案は?

4

8 に答える 8

194
In [4]: df = read_csv(StringIO(data),sep='\s+')

In [5]: df
Out[5]: 
   A         B       C
0  1  0.749065    This
1  2  0.301084      is
2  3  0.463468       a
3  4  0.643961  random
4  1  0.866521  string
5  2  0.120737       !

In [6]: df.dtypes
Out[6]: 
A      int64
B    float64
C     object
dtype: object

独自の関数を適用する場合、数値以外の列は自動的に除外されません。.sum()ただし、これは を に適用するよりも遅くなります。groupby

In [8]: df.groupby('A').apply(lambda x: x.sum())
Out[8]: 
   A         B           C
A                         
1  2  1.615586  Thisstring
2  4  0.421821         is!
3  3  0.463468           a
4  4  0.643961      random

sumデフォルトでは連結します

In [9]: df.groupby('A')['C'].apply(lambda x: x.sum())
Out[9]: 
A
1    Thisstring
2           is!
3             a
4        random
dtype: object

やりたいことは大体できる

In [11]: df.groupby('A')['C'].apply(lambda x: "{%s}" % ', '.join(x))
Out[11]: 
A
1    {This, string}
2           {is, !}
3               {a}
4          {random}
dtype: object

一度に 1 グループずつ、フレーム全体でこれを行います。キーは、を返すことですSeries

def f(x):
     return Series(dict(A = x['A'].sum(), 
                        B = x['B'].sum(), 
                        C = "{%s}" % ', '.join(x['C'])))

In [14]: df.groupby('A').apply(f)
Out[14]: 
   A         B               C
A                             
1  2  1.615586  {This, string}
2  4  0.421821         {is, !}
3  3  0.463468             {a}
4  4  0.643961        {random}
于 2013-07-24T17:51:18.437 に答える
77

メソッドを使用しapplyて、グループ化されたデータに任意の関数を適用できます。セットでご希望の方はお申し込みsetください。リストをご希望の方はお申し込みlistください。

>>> d
   A       B
0  1    This
1  2      is
2  3       a
3  4  random
4  1  string
5  2       !
>>> d.groupby('A')['B'].apply(list)
A
1    [This, string]
2           [is, !]
3               [a]
4          [random]
dtype: object

他の何かが必要な場合は、必要なことを行う関数を作成してから、それapplyを実行してください。

于 2013-07-24T17:51:56.377 に答える
34

aggregate(または) 関数を使用しaggて値を連結できる場合があります。(未テストのコード)

df.groupby('A')['B'].agg(lambda col: ''.join(col))
于 2013-07-24T17:52:29.270 に答える
10

簡単な解決策は次のとおりです。

>>> df.groupby(['A','B']).c.unique().reset_index()
于 2016-07-29T13:21:16.143 に答える