質問するログイン新規登録

Q&A

解決済

1回答

857閲覧

groupby(level = "カラム").sum()でカラムの合計が出せない。(インデックスは出せた)

tatatan

総合スコア3

Python

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

1グッド

0クリップ

投稿2024/10/02 01:35

1

0

実現したいこと

Pandasの階層型インデックスでカラムも複数の場合のカラム(列)方向に合計したい。

発生している問題・分からないこと

DataFrameの階層型インデックスでインデックス(行)方向の合計はhier_df.groupby(level = "key2").sum()で出せたが、カラム(列)方向のhier_df.groupby(level = "color").sum()で出せない。

エラーメッセージ

error

1--------------------------------------------------------------------------- 2ValueError Traceback (most recent call last) 3File ~\anaconda3\Lib\site-packages\pandas\core\indexes\multi.py:1664, in MultiIndex._get_level_number(self, level) 4 1663 try: 5-> 1664 level = self.names.index(level) 6 1665 except ValueError as err: 7 8ValueError: 'color' is not in list 9 10The above exception was the direct cause of the following exception: 11 12KeyError Traceback (most recent call last) 13Cell In[32], line 1 14----> 1 hier_df.groupby(level = "color", as_index=False).sum() 15 16File ~\anaconda3\Lib\site-packages\pandas\core\frame.py:9183, in DataFrame.groupby(self, by, axis, level, as_index, sort, group_keys, observed, dropna) 17 9180 if level is None and by is None: 18 9181 raise TypeError("You have to supply one of 'by' and 'level'") 19-> 9183 return DataFrameGroupBy( 20 9184 obj=self, 21 9185 keys=by, 22 9186 axis=axis, 23 9187 level=level, 24 9188 as_index=as_index, 25 9189 sort=sort, 26 9190 group_keys=group_keys, 27 9191 observed=observed, 28 9192 dropna=dropna, 29 9193 ) 30 31File ~\anaconda3\Lib\site-packages\pandas\core\groupby\groupby.py:1329, in GroupBy.__init__(self, obj, keys, axis, level, grouper, exclusions, selection, as_index, sort, group_keys, observed, dropna) 32 1326 self.dropna = dropna 33 1328 if grouper is None: 34-> 1329 grouper, exclusions, obj = get_grouper( 35 1330 obj, 36 1331 keys, 37 1332 axis=axis, 38 1333 level=level, 39 1334 sort=sort, 40 1335 observed=False if observed is lib.no_default else observed, 41 1336 dropna=self.dropna, 42 1337 ) 43 1339 if observed is lib.no_default: 44 1340 if any(ping._passed_categorical for ping in grouper.groupings): 45 46File ~\anaconda3\Lib\site-packages\pandas\core\groupby\grouper.py:897, in get_grouper(obj, key, axis, level, sort, observed, validate, dropna) 47 893 level = level[0] 48 895 if key is None and is_scalar(level): 49 896 # Get the level values from group_axis 50--> 897 key = group_axis.get_level_values(level) 51 898 level = None 52 900 else: 53 901 # allow level to be a length-one list-like object 54 902 # (e.g., level=[0]) 55 903 # GH 13901 56 57File ~\anaconda3\Lib\site-packages\pandas\core\indexes\multi.py:1832, in MultiIndex.get_level_values(self, level) 58 1784 def get_level_values(self, level) -> Index: # type: ignore[override] 59 1785 """ 60 1786 Return vector of label values for requested level. 61 1787 62 (...) 63 1830 Index([1.0, nan, 2.0], dtype='float64') 64 1831 """ 65-> 1832 level = self._get_level_number(level) 66 1833 values = self._get_level_values(level) 67 1834 return values 68 69File ~\anaconda3\Lib\site-packages\pandas\core\indexes\multi.py:1667, in MultiIndex._get_level_number(self, level) 70 1665 except ValueError as err: 71 1666 if not is_integer(level): 72-> 1667 raise KeyError(f"Level {level} not found") from err 73 1668 if level < 0: 74 1669 level += self.nlevels 75 76KeyError: 'Level color not found'

該当のソースコード

hier_df.groupby(level = "color").sum()

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

as_index=Falsを使うなど試してみましたが、どれもエラーが出てしまいます。

補足

特になし

melian👍を押しています

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

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

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

melian

2024/10/02 02:27 編集

※ 回答へ転記
guest

回答1

0

ベストアンサー

Pandas 2.2.3 の場合、pandas.DataFrame.groupby(axis=1, ...) では以下の様な FutureWarning が表示されますので、

python

1print(hier_df.groupby(axis=1, level = "color").sum()) 2FutureWarning: DataFrame.groupby with axis=1 is deprecated. Do `frame.T.groupby(...)` without axis instead.

ワーニングメッセージの通りに書き換えると以下の様になります。

python

1print(hier_df.T.groupby(level='color').sum().T)

投稿2024/10/02 02:27

melian

総合スコア21745

tatatan

2024/10/02 02:48

解決しました。ありがとうございます🙇
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.29%

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

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

質問する

関連した質問