57127


**\- 環境**  
macOS Mojave  
Python 3.7.3  
Jupyter Notebook 6.0.0

**\- やりたいこと**  
以下のように、[data]の各行に単一またはカンマ区切りで複数のデータがあります。  
[No]をキーとしたgroupbyで、[data]のデータを一つずつ取り出して配列を作りたいです。

![](https://i.stack.imgur.com/Cd79y.png)

**\-- 期待するアウトプット（list型でもSeries型でも構いません）**

[code]

    No
    1    [a, a, b, 1, 2, 3]
    2        [a, aa, bb, 1]
    
[/code]

**\- やったこと**  
以下のコードを実行しましたが、カンマ区切りの複数データを分割して単一の要素として配列に格納することができません。

[code]

    import pandas as pd
    df = pd.read_excel('/Users/USER/Desktop/dataframe.xlsx')
    df = df.astype({'data': 'str'})
    
    def singlelabel_generator(group):
        group_ = group['data'].values
        elements_list = [el.strip(', ') for el in group_]
    
        return elements_list
    
    elements_list = df.groupby('No').apply(singlelabel_generator)
    
    for el_check in elements_list:
        print(el_check)
    
    # 出力結果
    # ['a', 'a,b', '1', '2', '3'] <-'a,b'が'a', 'b'に分割されていない
    # ['a', 'aa,bb', '1'] <-'aa,bb'が'aa', 'bb'に分割されていない
    
[/code]


CC BY-SA 4.0
2019-08-02T07:28:03.037
57125
2019-08-05T10:28:10.450
2019-08-05T10:28:10.450
26841
26841
question
python pandas
groupbyでカンマ区切りのデータを一つずつ要素として取り出し、配列に格納したい


使う関数が`strip()`ではなく`split()`にすべきなのと、多くても2次元のリストでしょうから、`sum()`で1次元化出来るでしょう。次元が増えるのなら紹介記事の他のやり方を試してみてください。

[文字列の削除 split(), strip(), replace(), translate(), re.sub()](http://python-
remrin.hatenadiary.jp/entry/2017/04/24/174405)

> split()  
>  区切り文字(delimiter)を区切りとして、文字列を分割しリストを返す。
>
> strip()  
>  文字列の両端から指定文字をはぎとる。

[Pythonでflatten（多次元リストを一次元に平坦化）](https://note.nkmk.me/python-list-flatten/)

> sum()  
>  組み込み関数のsum()を使う方法もある。  
>  sum()の第二引数には初期値を指定できる。ここに空のリスト[]を指定すると、リストの+演算によって、要素のリストが連結される。

また、`def
singlelabel_generator(group):`で`label_list`を処理している部分は何処にも影響を及ぼしていないので、冗長な処理です。

ちなみに、期待するアウトプットの2行目は、`[a, aa, ,bb, 1]`ではなく`[a, aa, bb, 1]`(bbの前の`,`が余分)では？

macOS, Jupyter Notebookの環境でどうなるかはわかりませんが、  
まとめると、`def singlelabel_generator(group):`は以下のようになるのでは？

[code]

    def singlelabel_generator(group):
        group_ = group['data'].values
        elements_list = sum([el.split(',') for el in group_], [])
        
        return elements_list
    
[/code]

Windows10で素のPythonではこうなりました。

[code]

    ['a', 'a', 'b', '1', '2', '3']
    ['a', 'aa', 'bb', '1']
    
[/code]


CC BY-SA 4.0
2019-08-02T09:04:19.157
57127
2019-08-02T09:04:19.157
2020-06-17T08:14:45.997
-1
26370
57125
answer