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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

pandas

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

Q&A

解決済

2回答

1152閲覧

データフレームをpandasのgroupbyでグループ化してMySQLのテーブルに挿入したい

jkichi

総合スコア3

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

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

pandas

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

0グッド

0クリップ

投稿2021/07/10 06:01

下記のようなデータフレーム(df1)があるとします。

product area amount
梨   千葉  3,400
メロン 北海道 2,100
梨   栃木  2,400
メロン 茨城  4,200
クリ  熊本  2,500
クリ  愛媛   800
梨   茨城  2,300
クリ  茨城  4,400
メロン 熊本  2,200

このデータフレームをpandasのgroupbyで下記のようにグループ化して、MySQLのテーブルに挿入したいと考え、プログラムを書いてみました。

product area amount
クリ  熊本  2,500
クリ  愛媛   800
クリ  茨城  4,400
梨   千葉  3,400
梨   栃木  2,400
梨   茨城  2,300
メロン 北海道 2,100
メロン 茨城  4,200
メロン 熊本  2,200

import pandas as pd from sqlalchemy import create_engine df2 = df1.groupby('product') engine = create_engine('mysql+pymysql://root:hoge@localhost:3306/fuga?charset=utf8') df2.to_sql(name='piyo', con=engine, if_exists='replace', index=False)

groupbyによるグループ化、およびto_sqlによるMySQLへの挿入はそれぞれ単独では問題なく機能しているようなのですが、これらを組み合わせて「グループ化 → MySQLへの挿入」をやろうとすると、下記のエラーメッセージが出てしまいます。

AttributeError: Cannot access callable attribute ‘to_sql’ of ‘DataFrameGroupBy’ objects, try using the ‘apply’ method

どのようにしたらエラーを回避して「グループ化 → MySQLへの挿入」ができるかご教示いただけないでしょうか。
よろしくお願い致します。

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

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

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

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

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

bsdfan

2021/07/10 10:25

やろうとしていることの意図はなんでしょうか? 並べ替えてからデータベースに入れても、並べ替えた通りにデータベースに格納されるわけではないです。
jkichi

2021/07/10 12:41

ご質問いただきありがとうございます。 MySQLについてあまり詳しくないので 私の確認のやり方が間違っているのかもしれないのですが 今回ご回答いただいたやり方でデータを並べ替えて データベースに挿入した後、テーブルを確認したところ 並べ替えた通りに格納されているようでした。 また後で間違っていることが分かるのかもしれませんが とりあえず上手くいっていると考えて先に進んでみようと思います。 またアドバイスをいただけると幸いです。 よろしくお願い致します。
bsdfan

2021/07/10 13:24

とりあえず先に進むのでいいと思いますが、今回はたまたま想定通りになっているだけで、そうならない場合もあることは知っておいた方がいいですよ。
guest

回答2

0

ベストアンサー

グループ化はこういう目的のものではありません。
グループ化した状態からそういう形にするのは不可能ではありませんがとても大変です。

以下のように並べ替えをしましょう。

python

1>>> print(df) 2 product area amount 30 梨 千葉 3,400 41 メロン 北海道 2,100 52 梨 栃木 2,400 63 メロン 茨城 4,200 74 クリ 熊本 2,500 85 クリ 愛媛 800 96 梨 茨城 2,300 107 クリ 茨城 4,400 118 メロン 熊本 2,200 12>>> df_sorted = df.sort_values('product').reset_index(drop=True) 13>>> print(df_sorted) 14 product area amount 150 クリ 熊本 2,500 161 クリ 愛媛 800 172 クリ 茨城 4,400 183 メロン 北海道 2,100 194 メロン 茨城 4,200 205 メロン 熊本 2,200 216 梨 千葉 3,400 227 梨 栃木 2,400 238 梨 茨城 2,300

投稿2021/07/10 06:30

ppaul

総合スコア24670

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

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

jkichi

2021/07/10 07:42

早速ご回答いただき誠にありがとうございます。 このようなシンプルなやり方で出来るのですね。 どうやらgroupbyを使用することで頭が凝り固まっていたようです。 ちなみにご回答いただいたやり方にさらに手を加えて 下記のように同じproduct内でamount順に並び替えることは可能でしょうか。 product area amount 0 クリ 熊本 2,500 1 クリ 愛媛 800 2 クリ 茨城 4,400 3 メロン 北海道 2,100 4 メロン 茨城 4,200 5 メロン 熊本 2,200 6 梨 千葉 3,400 7 梨 栃木 2,400 8 梨 茨城 2,300 <amount順に並び替え> product area amount 0 クリ 茨城 4,400 1 クリ 熊本 2,500 2 クリ 愛媛 800 3 メロン 茨城 4,200 4 メロン 熊本 2,200 5 メロン 北海道 2,100 6 梨 千葉 3,400 7 梨 栃木 2,400 8 梨 茨城 2,300 お手数をお掛け致しますが、ご回答いただけると幸いです。 よろしくお願い申し上げます。
jkichi

2021/07/10 12:29

この度はご回答いただき誠にありがとうございました。 無事、自分のやりたいことができるようになりました。 また質問させていただく際にはよろしくお願い致します。
guest

0

python

1import pandas as pd 2import io 3 4data="""product,area,amount 5梨,千葉,'3,400' 6メロン,北海道,'2,100' 7梨,栃木,'2,400' 8メロン,茨城,'4,200' 9クリ,熊本,'2,500' 10クリ,愛媛,'800' 11梨,茨城,'2,300' 12クリ,茨城,'4,400' 13メロン,熊本,'2,200'""" 14 15df_1=pd.read_csv(io.StringIO(data),quotechar="'",thousands=',') 16 17df_1.sort_values(by=['product','amount'],ascending=[False,False]).reset_index(drop=True) 18 19""" 20 product area amount 210 梨 千葉 3400 221 梨 栃木 2400 232 梨 茨城 2300 243 メロン 茨城 4200 254 メロン 熊本 2200 265 メロン 北海道 2100 276 クリ 茨城 4400 287 クリ 熊本 2500 298 クリ 愛媛 800 30""" 31 32

amountを数字(int)に直しておけば、このように複数のsortが可能です。

投稿2021/07/10 09:32

toshikawa

総合スコア388

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

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

jkichi

2021/07/10 12:25

追加の質問にご回答いただき誠にありがとうございます。 最初にご回答いただいたppaulさんの回答と合わせて 自分のやりたいことができるようになりました。 また質問させていただくことがあると思いますが その際はぜひよろしくお願い致します。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問