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

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

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

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

Q&A

解決済

2回答

158閲覧

groupbyがうまく機能しない

Kyo_1209natsu

総合スコア3

Python

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

1グッド

0クリップ

投稿2025/01/12 04:42

実現したいこと

「pythonプログラミングとデータ分析」という書籍に沿って勉強を進めています。
下記の通り、groupbyメソッドを使用したいのですが、うまく動作しませんでした。
原因をご教示いただけると助かります。。。

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

下記エラーメッセージが表示されます

エラーメッセージ

error

1--------------------------------------------------------------------------- 2TypeError Traceback (most recent call last) 3/usr/local/lib/python3.10/dist-packages/pandas/core/groupby/groupby.py in _agg_py_fallback(self, how, values, ndim, alt) 4 1941 try: 5-> 1942 res_values = self._grouper.agg_series(ser, alt, preserve_dtype=True) 6 1943 except Exception as err: 7 817 frames 9TypeError: can only concatenate str (not "int") to str 10 11The above exception was the direct cause of the following exception: 12 13TypeError Traceback (most recent call last) 14/usr/local/lib/python3.10/dist-packages/pandas/core/groupby/groupby.py in _agg_py_fallback(self, how, values, ndim, alt) 15 1944 msg = f"agg function failed [how->{how},dtype->{ser.dtype}]" 16 1945 # preserve the kind of exception that raised 17-> 1946 raise type(err)(msg) from err 18 1947 19 1948 if ser.dtype == object: 20 21TypeError: agg function failed [how->mean,dtype->object] 22

該当のソースコード

Python(それまで実行した処理)

1zip_url = 'https://archive.ics.uci.edu/ml/machine-learning-databases/00222/bank.zip' 2fn = 'bank-full.csv' 3 4!wget $zip_url 5!unzip -o bank.zip 6 7import pandas as pd 8 9df = pd.read_csv( 10 fn, 11 sep = ';', 12 na_values='unknown', 13 true_values=['yes'], 14 false_values=['no']) 15 16columns = [ 17 '年齢','職業','婚姻','学歴','債務不履行','平均残高','住宅ローン','個人ローン','連絡手段','最終通話日','最終通話月','最終通話秒数','通話回数_販促中','前回販促後_経過日数','通話回数_販促前','前回販促結果','今回販促結果'] 18 19df2 = df.copy() 20df2.columns = columns 21 22columns1 = list(df2.columns) 23print(columns1) 24columns2 = columns1[-1:]+columns1[:-9] 25print(columns2) 26df2 = df2[columns2] 27 28

Python(エラーコード)

1df_gr1 = df2.groupby('学歴').mean() 2 3display(df_gr1)

試したこと・調べたこと

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

書籍を見返しても、誤字した箇所がわからず・・・
ご教示いただけますと幸いです。
よろしくお願いいたします。

補足

特になし

melian👍を押しています

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

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

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

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

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

melian

2025/01/12 05:17 編集

mean() メソッドに numeric_only=True を指定してください。 df_gr1 = df2.groupby('学歴').mean(numeric_only=True)
Kyo_1209natsu

2025/01/12 05:23

melian様、ありがとうございます! 該当のコードは、文字型である「学歴」も計算対象となっていたがためのエラーだったのですね。 ご指摘いただいた通り記載してみたところ、問題なく結果が表示されました。ありがとうございました。
guest

回答2

0

コメントに記載した通り、mean() メソッドに numeric_only=True を指定する必要がありますが、当該書籍の正誤表にも同様の記載がありました。

4章 p.358 コード4-15 2行目
(出版時)
df.groupby('客室クラス').mean()
(現在)
df.groupby('客室クラス').mean(numeric_only=True)

書籍の初版が発行された時点での numeric_only キーワードのデフォルト値が None であり、Pandas の最新版(2.2.3)でのデフォルト値は False であるために発生したエラーだと考えられます。

numeric_only: boolean, default None

Include only float, int, boolean columns. If None, will attempt to use everything, then use only numeric data. Not implemented for Series.

numeric_only: bool, default False
Include only float, int, boolean columns. Not implemented for Series.

投稿2025/01/12 05:44

melian

総合スコア20721

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

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

0

ベストアンサー

mean関数は数値型のデータに対してのみ適用可能であり、数値型じゃないデータに対しては適用できないです。
なので、数値型の列のみを選択してmeanを適用しましょう。

(前半の元のコードは修正不要なので省略)

(後半のデータ抽出部分を以下のように修正)

df_gr1 = df2.groupby('学歴').mean(numeric_only=True) display(df_gr1)

投稿2025/01/12 05:15

編集2025/01/12 06:01
patapi

総合スコア874

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

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

Kyo_1209natsu

2025/01/12 05:35

kotori_a様 ありがとうございます! データの中でも、特定の特徴を持つデータのみ指定することが可能なのですね。 いただいた修正コードで試してみたところ、うまく作動いたしました。 ありがとうございました。
Kyo_1209natsu

2025/01/12 05:36

melian様の方法でもうまく動作したのですが、コメントによる回答であったことからベストアンサーに選ぶことができず、kotori_a様をベストアンサーに選ばせていただきました。 迅速にご回答をいただき、ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.34%

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

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

質問する

関連した質問