87981


DataFrameで各行毎に処理をした結果を1つのリストにまとめたいです。  
下記のように書くことはできたのですが、可読性向上のために、`myfunc`内で関数外のリストに要素を追加しているのをやめて、別の方法で書くことはできないでしょうか？  
`apply`以外の方法でも構わないのですが、`iterrows`は使わずに書きたいです。

[code]

    import pandas as pd
    
    df = pd.DataFrame(
        [
            ["Yamada", ["a", "b", "c"]],
            ["Tanaka", ["d", "a", "f"]],
            ["Suzuki", ["g", "h", "i"]],
        ],
        columns=["name", "tags"],
    )
    
    # 結果のリスト
    # myfunc関数内から関数外の変数を更新しているのをやめたい
    names = []
    first_tags = []
    
    
    def myfunc(row):
        names.append(row["name"])
        first_tags.append(row["tags"][0])
    
    
    df.apply(myfunc, axis=1)
    
    print(names)  # ['Yamada', 'Tanaka', 'Suzuki']
    print(first_tags)  # ['a', 'd', 'g']
    
[/code]


CC BY-SA 4.0
2022-03-23T06:58:46.907
87980
2022-03-23T11:40:36.017
19297
question
python python3 pandas numpy
DataFrameで各行毎に処理をした結果を1つのリストにまとめる方法


関数外の変数に直接アクセスせず、変数のスコープを絞りたいという意図であれば[pandas.DataFrame.apply](https://pandas.pydata.org/pandas-
docs/stable/reference/api/pandas.DataFrame.apply.html)に`args`を渡すことで対応可能です。  
※下記サンプルコードの`myfunc`をご参照ください。

関数からは絶対にリストへアクセスせず、各行のデータのみ扱うよう疎結合にしたいならば、関数では単純にSeriesを返しておき、関数外でリスト化する方法もあります。  
※下記サンプルコードの`my_first_tags`をご参照ください。

[code]

    import pandas as pd
    
    df = pd.DataFrame(
        [
            ["Yamada", ["a", "b", "c"]],
            ["Tanaka", ["d", "a", "f"]],
            ["Suzuki", ["g", "h", "i"]],
        ],
        columns=["name", "tags"],
    )
    
    # 結果のリスト
    # myfunc関数内から関数外の変数を更新しているのをやめたい
    names = []
    first_tags = []
    
    def myfunc(row, ns, fts):
        ns.append(row["name"])
        fts.append(row["tags"][0])
    
    df.apply(myfunc, axis=1, args=(names, first_tags))
    
    print(names)  # ['Yamada', 'Tanaka', 'Suzuki']
    print(first_tags)  # ['a', 'd', 'g']
    
    def my_first_tags(row):
        return row["tags"][0]
    
    first_tags = df.apply(my_first_tags, axis=1).values.tolist()
    print(first_tags)  # ['a', 'd', 'g']
    
[/code]


CC BY-SA 4.0
2022-03-23T07:51:54.277
87981
2022-03-23T08:00:58.170
2022-03-23T08:00:58.170
9820
9820
87980
answer

[code]

    names = df['name'].to_list()
    first_tags = df['tags'].str[0].to_list()
    print(names)
    print(first_tags)
    
    #
    ['Yamada', 'Tanaka', 'Suzuki']
    ['a', 'd', 'g']
    
[/code]


CC BY-SA 4.0
2022-03-23T11:40:36.017
87990
2022-03-23T11:40:36.017
47127
87980
answer