47030
# 環境

  * Python3.6.5
  * pandas 0.23.0

# 背景

普段はDataFrameの`groupby`メソッドを使っています。  
最近、Seriesにも`groupby`メソッドがあることを知り、使ってみようと思います。

<https://pandas.pydata.org/pandas-
docs/version/0.23/generated/pandas.Series.groupby.html>

# 質問

pandasのSeriesクラスの`groupby`メソッドは、どのように使えばよろしいでしょうか？

以下のコードを実行すると、「by or levelが必要」というエラーが出ます。

```

    s = pd.Series(["a","a","b"])
    s.groupby()
    #TypeError: You have to supply one of 'by' and 'level'
    
```

マニュアルで`by`の説明を見ましたが、よく分かりませんでした。  
`by`にはどういった情報を渡せばよいでしょうか？

> by : mapping, function, label, or list of labels
>
> Used to determine the groups for the groupby. If by is a function,  
>  it’s called on each value of the object’s index. If a dict or Series  
>  is passed, the Series or dict VALUES will be used to determine the  
>  groups (the Series’ values are first aligned; see .align() method). If  
>  an ndarray is passed, the values are used as-is determine the groups.  
>  A label or list of labels may be passed to group by the columns in  
>  self. Notice that a tuple is interpreted a (single) key.

# やってみたこと

<https://stackoverflow.com/questions/33483670/how-to-group-a-series-by-values-
in-pandas>

上記サイトを見て、以下のようなコードでgroupbyすることはできました。  
しかし、`groupby`メソッドに自分自身のSeriesを渡して、なぜgroupbyできるかが分かりませんでした。

```

    s = pd.Series(["a","a","b"])
    print(s.groupby(s).count())
    a    2
    b    1
    dtype: int64
    
```
CC BY-SA 4.0
2018-07-26T04:19:26.000
46977
2018-07-27T09:45:48.587
2018-07-26T06:05:00.803
19110
19524
question
python pandas
pandas の Seriesクラスの`groupby`メソッドの使い方
以下のようにしてみればわかるのですが、`Series`の`groupby`は、配列で渡した場合はそれで`Series`を`groupby`しています。`If
an ndarray is passed, the values are used as-is determine the
groups.`という記述と合致していています。

```

    >>> s = pd.Series(["a","a","b"])
    >>> for i in s.groupby([10, 11, 11]):
    ...   print(i)
    ...
    (10, 0    a
    dtype: object)
    (11, 1    a
    2    b
    dtype: object)
    
```

また、辞書で渡す場合は、以下のようにすると上と同じ結果になります。これは、`If a dict or Series is passed, the
Series or dict VALUES will be used to determine the groups (the Series’ values
are first aligned; see .align() method).`という説明と合致します。

```

    >>> for i in s.groupby({0:10, 1:11, 2:11}):
    ...   print(i)
    ...
    (10, 0    a
    dtype: object)
    (11, 1    a
    2    b
    dtype: object)
    
```

自分自身のSeriesを渡すと以下のようになります。

```

    >>> for i in s.groupby(s):
    >>>   print(i)
    ...
    ('a', 0    a
    1    a
    dtype: object)
    ('b', 2    b
    dtype: object)
    
```

なお、Seriesの要素の出現回数が必要な場合は通常`value_counts()`を使います。

```

    >>> s.value_counts()
    a    2
    b    1
    dtype: int64
    
```
CC BY-SA 4.0
2018-07-27T08:36:47.320
47030
2018-07-27T09:45:48.587
2018-07-27T09:45:48.587
15171
15171
46977
answer