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

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

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

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

pandas

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

Q&A

解決済

1回答

2059閲覧

python pandas groupby()のエラーを解決してほしいです

donzu

総合スコア2

Python

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

pandas

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

0グッド

0クリップ

投稿2023/05/13 15:40

実現したいこと

ここに実現したいことを箇条書きで書いてください。
pandasでおきたエラーを解決したい

前提

ここに質問の内容を詳しく書いてください。

pandaでデータ分析の勉強中です
groupby()を使いたいのですがエラーがおきて使えません

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

都道府県コード 都道府県名 元号 和暦(年) 西暦(年) 人口(総数) 人口(男) 人口(女) 0 0 全国 大正 9.0 1920.0 55963053 28044185 27918868 1 1 北海道 大正 9.0 1920.0 2359183 1244322 1114861 2 2 青森県 大正 9.0 1920.0 756454 381293 375161 3 3 岩手県 大正 9.0 1920.0 845540 421069 424471 4 4 宮城県 大正 9.0 1920.0 961768 485309 476459 ... ... ... ... ... ... ... ... ... "None of [Index(['人口(総数)', '人口(男)', '人口(女)'], dtype='object')] are in the [columns]"``` ### 該当のソースコード ```python a.groupby(by='都道府県名').mean()[['人口(総数)','人口(男)','人口(女)']].round(0)

試したこと

print(a.columns)でカラムをそのままコピーしてみましたが同じくエラーでした

補足情報(FW/ツールのバージョンなど)

データと同じ記述になっているかや、空白の有無などはデータのカラムをそのままコピーしたので会ってると思います

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

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

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

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

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

melian

2023/05/13 15:52

mean() とカラムの指定が逆の様な気がします。 grp = a.groupby(by='都道府県名')[['人口(総数)','人口(男)','人口(女)']].mean().round(0) print(grp)
donzu

2023/05/13 16:08

回答していただきありがとうございます。その通りにうって見たところ 表示されたもの Empty DataFrame Columns: [] Index: [三重県, 京都府, 人口集中地区, 人口集中地区以外の地区, 佐賀県, 全国, 兵庫県, 北海道, 千葉県, 和歌山県, 埼玉県, 大分県, 大阪府, 奈良県, 宮城県, 宮崎県, 富山県, 山口県, 山形県, 山梨県, 岐阜県, 岡山県, 岩手県, 島根県, 広島県, 徳島県, 愛媛県, 愛知県, 新潟県, 東京都, 栃木県, 沖縄県, 滋賀県, 熊本県, 石川県, 神奈川県, 福井県, 福岡県, 福島県, 秋田県, 群馬県, 茨城県, 長崎県, 長野県, 青森県, 静岡県, 香川県, 高知県, 鳥取県, 鹿児島県] C:\Users\Owner\AppData\Local\Temp\ipykernel_22036\2790384547.py:1: FutureWarning: The default value of numeric_only in DataFrameGroupBy.mean is deprecated. In a future version, numeric_only will default to False. Either specify numeric_only or select only columns which should be valid for the function. grp = a.groupby(by='都道府県名')[['人口(総数)','人口(男)','人口(女)']].mean().round(0) ​ となってしまいました。Empty DataFrame というのが問題なのでしょうか?回答宜しくお願い致します。
melian

2023/05/13 17:48 編集

※ 回答へ移動
guest

回答1

0

ベストアンサー

データフレームのカラム名や都道府県名を見ると(「人口集中地区」が含まれている)、元のデータは 国勢調査 時系列データ CSV形式による主要時系列データ | 政府統計の総合窓口 にある「男女別人口 ─ 全国、都道府県(大正9年〜平成27年)」の CSV ファイル(c01.csv)だと思われます。

python

1import pandas as pd 2 3df = pd.read_csv('c01.csv', encoding='cp932') 4cols = ['人口(総数)','人口(男)','人口(女)'] 5 6# 「注」カラムを削除 7df = df.drop(columns=['注']) 8# 末尾のコメント行を削除 9df = df[~df.isna().any(axis=1)] 10# 欠損値を含む行(1945年沖縄県のデータ)を削除 11df = df[~df['人口(総数)'].eq('-')] 12# 人口が str 型で読み込まれているので int 型に変換 13df.loc[:,cols] = df.loc[:,cols].astype(int) 14 15# 都道府県別の平均人口 16mean_by_prefs = df.groupby(by='都道府県名', sort=False)[cols].mean().round().astype(int) 17print(mean_by_prefs)
都道府県名人口(総数)人口(男)人口(女)
全国987979924852846750269524
北海道460610422722352333869
青森県1275593616330659262
岩手県1279266620464658801
宮城県1801085884667916418
秋田県1163376562366601010
山形県1208075583306624769
福島県1904836926054978782
茨城県224919011107561138434
栃木県1610963791048819915
群馬県1651464807646843817
埼玉県404010920234282016681
千葉県359166817899461801721
東京都935739247406444616748
神奈川県507221125820362490175
新潟県230082411158971184927
富山県993675479456514218
石川県995672479600516071
福井県743214359213384000
山梨県775773378482397290
長野県19842449598361024407
岐阜県1698390828213870176
静岡県289209914226731469425
愛知県493829524575822480712
三重県1534021743366790654
滋賀県992977483652509324
京都府213531710440931091224
大阪府638077231677583213013
兵庫県423352520675832165941
奈良県993523479185514337
和歌山県978371471085507285
鳥取県566552271488295064
島根県783345378944404400
岡山県1679700810947868752
広島県234702611464421200583
山口県1433456692875740581
徳島県793727382319411407
香川県905635437364468271
愛媛県1385960664193721767
高知県785564376501409062
福岡県392758619033272024258
佐賀県830574395550435023
長崎県1477374715120762253
熊本県1679703800656879047
大分県1142165544737597427
宮崎県1024879492893531986
鹿児島県1718576813282905293
沖縄県983286477057506229
人口集中地区762636363749831738765319
人口集中地区以外の地区451105112194681023163701

投稿2023/05/13 17:48

melian

総合スコア19703

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

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

donzu

2023/05/14 12:56

返信遅くなってすいません。見本のコードまで作っていただき本当にありがとうございます。解決することができました。 ひとつわからないことがあるのですが df = df[~df.isna().any(axis=1)] df = df[~df['人口(総数)'].eq('-')] このコードの[~df ]はどういう役割か 教えていただけますでしょうか。よろしくお願いします。
melian

2023/05/14 13:06

e-Stat の CSV ファイルには欠損値が含まれています。具体的には以下の行で、「人口(総数)」、「人口(男)」、「人口(女)」の値が "-" になっています。 "47","沖縄県","昭和",20,1945,"1)",-,-,- この行を取り除くためのものです。 df['人口(総数)'].eq('-') は、「人口(総数)」列の値が "-" の行にマッチします。これにチルダ("~")を付けると条件が反転して、「人口(総数)」列の値が "-" ではない行という意味になります。結果的に欠損値を含まない行が抽出されることになります。
donzu

2023/05/14 13:19

とても分かりやすい回答をしていただきありがとうございました。おかげで分からなかったところがすっきりしました。改めて丁寧に答えていただき本当にありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問