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

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

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

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

pandas

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

Q&A

解決済

3回答

6421閲覧

pandas groupbyを2段階に分けて複数回実行し、その結果をデータフレームとしてソートしたい

ak_miyamoto

総合スコア31

Python 3.x

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

pandas

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

0グッド

1クリップ

投稿2018/02/08 03:20

編集2018/02/08 03:27

環境:python3.6,win10
初学者です。pd.DataFrameを2段階に分けてgroupbyし、2段階目の結果をデータフレームとして処理(ソート)していきたいと考えております。
具体的には、

python3.6

1import pandas as pd 2df = pd.DataFrame(df,columns = ["LargeA","a","b","c","d","e"]) 3 4for g in file004.groupby("LargeA"): 5 Large = [] #空リストを設定 6 7 for i in g[1].groupby(["a","b","c"]): 8 i[1] = i[1].sort_values(by=["d"], ascending=True) 9    #i[1]はデータフレームのはずなのに、ここでエラーが起きる 10    #他の処理のコード 11    Large.append(#処理結果) 

とすると、

python3.6

1TypeError Traceback (most recent call last) 2<ipython-input-173-1c138ff25602> in <module>() 3 6 for i in g[1].groupby(["a","b","c"]): 4----> 7 i[1] = i[1].sort_values(by=["d"], ascending=True) 5 8 6 7TypeError: 'tuple' object does not support item assignment

となってしまいます。groupbyで発生させたgやiはDataFrameのように扱っていけたと記憶しているのですが、以上の通りうまくいきません。ソートするコードか、g,iの扱い方に問題があるようです。
どのようにコードを修正すればよろしいでしょうか?教えて下さると幸いです。

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

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

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

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

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

guest

回答3

0

for文の中のiはtuple形式です。エラー箇所がやろうとしていることはtupleのindexが1の内容をsort後のデータで更新するというものです。tupleはindexを使って参照はできても更新はできないため、エラーとなっています。
したがって、i[1]でdataframeを取り出した上、更新したい列をlocかilocで明示するように修正すればうまくいくと思います。

投稿2018/02/08 04:51

R.Shigemori

総合スコア3376

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

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

ak_miyamoto

2018/02/08 05:18

よくわかりました。業務上このような方式をよく使うのですが、今日明確に教えていただいてすっきりしました。 ありがとうございました。今後ともよろしくお願い致します。
guest

0

ベストアンサー

groupbyで発生させたgやiはDataFrameのように扱っていけたと記憶しているのですが

正確には、「gやi」ではなく「gやiの2つ目の要素の g[1]やi[1]」となりますが、その認識は間違いありません。
このエラー行の右辺

Python

1i[1].sort_values(by=["d"], ascending=True)

の部分は問題なく動作しているかと思います。

問題なのは、その結果を

Python

1i[1] = i[1].sort_values(by=["d"], ascending=True)

と書き戻している箇所となります。

ここで iタプルとなっており、タプルは要素の書き換えができませんのでここでエラーが発生します。

修正方法としては

Python

1i[1].sort_values(by=["d"], ascending=True, inplace=True)

として、i[1] を上書きするのではなく、内部状態を変更するようにするとエラーは起きなくなるかと思います。

また、特にここでi[1] を上書きする必要性は無いように思いますので

Python

1tmp_df = i[1].sort_values(by=["d"], ascending=True)

のように別変数に代入して、以降の処理をそちらを使用するようにしてもよいかもしれません。

投稿2018/02/08 04:39

magichan

総合スコア15898

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

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

ak_miyamoto

2018/02/08 05:17

依頼にこたえて下さり恐縮です。 よく状況が理解できました。つまり、タプルであるi[1]はデータフレームのように同名での定義のし直しができないということなのですね。解決いたしました。 今後ともよろしくお願いいたします。
guest

0

試していないですが、.iloc[:,:]でもうまくいきませんか?

投稿2018/02/08 03:31

mkgrei

総合スコア8560

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

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

ak_miyamoto

2018/02/08 03:35

groupbyの代わりにilocを使うということでしょうか? そうであれば、元データがかなり量が多いうえバラバラなデータの並びになっているため、番号指定での抽出は難しいのではないかと思います。 言葉足らずですみません、ありがとうございます。
ak_miyamoto

2018/02/08 05:15

他の方のご回答で意味がわかりました。重ねてありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問