質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

Q&A

解決済

2回答

360閲覧

【pandas】groupby後に複数の値をreturnする関数をapplyしたときの結果を配列ではなく複数のれるで得たい

beluga00nm

総合スコア12

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

pandas

Pandasは、PythonでRにおけるデータフレームに似た型を持たせることができるライブラリです。 行列計算の負担が大幅に軽減されるため、Rで行っていた集計作業をPythonでも比較的簡単に行えます。 データ構造を変更したりデータ分析したりするときにも便利です。

0グッド

0クリップ

投稿2022/10/12 11:45

前提

Python3
Jupyter notebook
pandas

実現したいこと

次のようなPandasのDataFrameを持っていて

data1data2data3group
1001101201
1301401501
1601701801
1902002102
2202302402
2502602702
2802903002
3103203303
3403503603

これに対し

python

1def hoge_func(group) 2 ・・・ 3 return num1、num2、num3 4result = df.groupby('group').apply(hoge_func)

としました。
hoge_funcは見ての通りdata1、data2、data3の3つの値を使って
新しくnum1、num2、num3を返す関数です。

このとき下のようにresultがpandasのSeriesの形式になってしまい、
一つの列にnum1、num2、num3がタプルとして格納されてしまいます。

index0
1(100,200,300)
2(400,500,600)
3(700,800,900)

num1、num2、num3を別々の列とした一つのDataFrameを得るにはどうすればよいでしょうか。
ついでにそのDataFrameの列名もnum1、num2、num3としたいのですが
どなたか教えていただけないでしょうか。

試したこと

できてしまったSeriesにたいして、

python

1result.apply(pd.Series)

として改めてDataFrameにすることはできたのですが、
この場合どの時点で列名前を指定するのか分かりませんでした。
あとから.renameで列名を変えるのでもいいのですが、
せっかくならもっとスマートに結果の出力の時点で列名付きのDataFrameを得られないのかなと思いました。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

applyする関数で、pandas.Series を返すようにすればいいです。
Seriesのindexが、出来上がるデータフレームの列名になります。

python

1def hoge_func(group) 2 ... 3 return pd.Series([num1, num2, num3], 4 index=['num1', 'num2', 'num3']) 5 6result = df.groupby('group').apply(hoge_func)

投稿2022/10/12 13:20

bsdfan

総合スコア4567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

beluga00nm

2022/10/17 10:44

とてもシンプルな解決方法をありがとうございます! まるほど、returnの時点でseries形式にしてしまえばよかったのですね。
guest

0

python

1result = [g.filter(regex='^data', axis=1) 2 .rename(columns=lambda x: x.replace('data', 'num')) 3 .reset_index(drop=True) 4 for _, g in df.groupby('group')] 5 6print(len(result)) 7print(type(result[0])) 8print(result[0]) 9print(result[1]) 10print(result[2]) 11 12# 133 14<class 'pandas.core.frame.DataFrame'> 15 16 num1 num2 num3 170 100 110 120 181 130 140 150 192 160 170 180 20 21 num1 num2 num3 220 190 200 210 231 220 230 240 242 250 260 270 253 280 290 300 26 27 num1 num2 num3 280 310 320 330 291 340 350 360

投稿2022/10/12 12:15

編集2022/10/12 12:50
melian

総合スコア19798

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問