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

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

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

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

Q&A

解決済

1回答

1949閲覧

pandas の MultiIndexで "level,, が認識されない

Ryuuuki37

総合スコア1

Python

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

0グッド

0クリップ

投稿2023/12/26 16:56

実現したいこと

pandas の MultiIndexの階層ごとの集計において"level,,を正しく機能させたい。

前提

3列3行のデータを作成し、インデックスとカラムを設定

hier_df= DataFrame(
np.arange(9).reshape((3,3)),
index = [
['a','a','b'],
[1,2,2]
],
columns = [
['Osaka','Tokyo','Osaka'],
['Blue','Red','Red']
]
)
hier_df

indexに名前を付ける

hier_df.index.names =['key1','key2']

カラムに名前を付ける

hier_df.columns.names =['city','color']
hier_df

階層ごとの要約統計量:行合計

hier_df.sum(level = 'key2', axis = 0)

PandasでのMultiIndexでインデックスを軸とした集計のため上記のコードを試したところ以下のようなエラーが出ました。
この集計において "level,, を使用できるようにするにはどうすれば良いでしょうか。

アドバイスいただけますと幸いです。

発生している問題・エラーメッセージ

TypeError Traceback (most recent call last)
Cell In[5], line 2
1 # 階層ごとの要約統計量:行合計
----> 2 hier_df.sum(level = 'key2', axis = 0)

File ~/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py:11512, in NDFrame._add_numeric_operations.<locals>.sum(self, axis, skipna, numeric_only, min_count, **kwargs)
11493 @doc( # type: ignore[misc]
11494 _num_doc,
11495 desc="Return the sum of the values over the requested axis.\n\n"
(...)
11510 **kwargs,
11511 ):

11512 return NDFrame.sum(self, axis, skipna, numeric_only, min_count, **kwargs)

File ~/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py:11280, in NDFrame.sum(self, axis, skipna, numeric_only, min_count, **kwargs)
11272 def sum(
11273 self,
11274 axis: Axis | None = None,
(...)
11278 **kwargs,
11279 ):

11280 return self._min_count_stat_function(

11281 "sum", nanops.nansum, axis, skipna, numeric_only, min_count, **kwargs
11282 )

File ~/anaconda3/lib/python3.11/site-packages/pandas/core/generic.py:11252, in NDFrame._min_count_stat_function(self, name, func, axis, skipna, numeric_only, min_count, **kwargs)
11240 @final
11241 def _min_count_stat_function(
11242 self,
(...)
11249 **kwargs,
11250 ):
11251 if name == "sum":

11252 nv.validate_sum((), kwargs)

11253 elif name == "prod":
11254 nv.validate_prod((), kwargs)

File ~/anaconda3/lib/python3.11/site-packages/pandas/compat/numpy/function.py:82, in CompatValidator.call(self, args, kwargs, fname, max_fname_arg_count, method)
80 validate_kwargs(fname, kwargs, self.defaults)
81 elif method == "both":
---> 82 validate_args_and_kwargs(
83 fname, args, kwargs, max_fname_arg_count, self.defaults
84 )
85 else:
86 raise ValueError(f"invalid validation method '{method}'")

File ~/anaconda3/lib/python3.11/site-packages/pandas/util/_validators.py:221, in validate_args_and_kwargs(fname, args, kwargs, max_fname_arg_count, compat_args)
216 raise TypeError(
217 f"{fname}() got multiple values for keyword argument '{key}'"
218 )
220 kwargs.update(args_dict)
--> 221 validate_kwargs(fname, kwargs, compat_args)

File ~/anaconda3/lib/python3.11/site-packages/pandas/util/_validators.py:162, in validate_kwargs(fname, kwargs, compat_args)
140 """
141 Checks whether parameters passed to the **kwargs argument in a
142 function fname are valid parameters as specified in *compat_args
(...)
159 map to the default values specified in compat_args
160 """
161 kwds = kwargs.copy()
--> 162 _check_for_invalid_keys(fname, kwargs, compat_args)
163 _check_for_default_values(fname, kwds, compat_args)

File ~/anaconda3/lib/python3.11/site-packages/pandas/util/_validators.py:136, in _check_for_invalid_keys(fname, kwargs, compat_args)
134 if diff:
135 bad_arg = list(diff)[0]
--> 136 raise TypeError(f"{fname}() got an unexpected keyword argument '{bad_arg}'")

TypeError: sum() got an unexpected keyword argument 'level'

該当のソースコード

階層ごとの要約統計量:行合計
hier_df.sum(level = 'key2', axis = 0)

試したこと

'key2, の代わりにインデックス数である1や2(ex. level = 1 or level = 2)を代わりに使用しましたが、
同様に sum() got an unexpected keyword argument 'level' のエラーが発生しました。

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

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

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

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

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

guest

回答1

0

ベストアンサー

pandas.DataFrame.groupby() を使います。

python

1sum_key2 = hier_df.groupby(level = 'key2').sum() 2print(sum_key2) 3 4# city Osaka Tokyo Osaka 5# color Blue Red Red 6# key2 7# 1 0 1 2 8# 2 9 11 13

投稿2023/12/26 17:23

melian

総合スコア21118

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

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

Ryuuuki37

2023/12/26 18:13

ありがとうございます。解決しました! どうやらこの書籍の誤植の可能性が高いです...
TakaiY

2023/12/27 01:01

誤植ではなくて、pandasのバージョンの問題でしょう。 level引数は1.5には存在しますが、この時点でDeprecatedです。 https://pandas.pydata.org/pandas-docs/version/1.5/reference/api/pandas.DataFrame.sum.html 最新には存在しません。 https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.sum.html 書籍やWebの記事を参考にする場合、使われているモジュールのバージョンなどを気にする必要があります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問