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

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

新規登録して質問してみよう
ただいま回答率
86.02%
Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python

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

pandas

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

Q&A

解決済

PythonのPandasを使って組み合わせ計算の最大値を求めたい(Excel、スプレッドシート)

Coon
Coon

総合スコア1

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python

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

pandas

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

2回答

0グッド

1クリップ

331閲覧

投稿2022/12/08 15:18

前提

PythonのPandasを使って組み合わせ計算の最大値を求めたい

実現したいこと

下記のようなデータ表を作りました。
4つの動物を選択し、列2の値の合計と列3の値の合計値をかけた積の最大を求めたいです。
例えばかめ、うさぎ、うぉんばっと、まんとひひを選んだ場合、
(18897+20312+24282+23890)*(0.6717759+0.43125207+0.31928901+0.944748929)
と言った感じで、結果は206836.586194329となります。
計算結果が最大になる動物の組み合わせを出したいと考えています。

列1列2列3
かめ188970.6717759
うさぎ203120.43125207
ねこ175570.621294404
ごりら244160.659812699
うぉんばっと242820.31928901
まんとひひ238900.944748929
ねずみ237680.445755777

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

エクセルファイルを読み込ませようとしたのですが、
FileNotFoundError: [Errno 2] No such file or directory: 'パンダ用.xlsx'
と表示が出ました。
また、この作業がPythonでできるのか疑問になってきました。

試したこと

先ずはいつも使っているGoogleでなんとかなると思い、スプレッドシートの関数、スクリプトで試みましたが、挫折しました。その後ググりまくってPandasなら統計を扱えるという記事を見つけインストールしました。
考えられる組み合わせをすべて挙げ、計算結果を出した上で並べ替えればいいだろうと考えたのですが、もとのデータは500行超あるため、並べあげるだけでスプレッドシートで扱える18278行を超過し断念しました。また、製品版Excelを持っていないためVBAが使えません

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

Windows11
Python
WPS Office
すべて最新だと思います。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

2022/12/09 04:06

こちらの質問が複数のユーザーから「やってほしいことだけを記載した丸投げの質問」という指摘を受けました。

meg_

2022/12/08 16:55

> FileNotFoundError: [Errno 2] No such file or directory: 'パンダ用.xlsx'と表示が出ました。 ファイルパスが間違っているのでしょう。パスを確認しましょう。
Coon

2022/12/09 11:29

保存しているファイルがだめだったようです。 普段ローカルで作業しないので知りませんでした。

回答2

0

もとのデータは500行超あるため、並べあげるだけでスプレッドシートで扱える18278行を超過

さすがに組み合わせ総数が大きすぎ、非線形な組み合わせ最適化問題だと思うので、あくまで近似解を求める考えとしての回答です。

列2, 列3, 列2*列3の各値のトップn(nは4以上の適当な値)行をそれぞれ求め、それらの行(の和集合)のみを対象として探すとそれなりに可能性の高い結果が得られそうです。
ただし各列の値の範囲が狭い(似た者同士)だと精度は落ちるような気がしますが。

Python

1import pandas as pd 2from itertools import combinations 3import numpy as np 4 5 6# 厳密解 7def solve1(df, cnt=4): 8 data = df.values 9 max_v, max_idx = -1, None 10 for idx in combinations(range(len(data)), cnt): 11 v = data[idx,1].sum() * data[idx,2].sum() 12 if v > max_v: 13 max_v = v 14 max_idx = idx 15 16 return max_v, sorted(data[max_idx,0]) # 分かりやすいよう名前は昇順に 17 18 19# 近似解 20# ratio :候補抽出時の 安全(余裕)率 21def solve2(df, cnt=4, ratio=2): 22 23 # 各値の大きいものを候補として抽出 24 idx = set() 25 for sr in [df['v1'], df['v2'], df['v1']*df['v2']]: 26 idx |= set(sr.sort_values(ascending=False).head(cnt*ratio).index.tolist()) 27 28 df2 = df.loc[list(idx),:] 29 return solve1(df2, cnt) 30 31# テストデータ作成 32def make_data(N): 33 return pd.DataFrame({"name": [f'Name{i+1}' for i in range(N)], 34 "v1": np.random.randint(10000,30000, N), 35 "v2": np.random.rand(N)}) 36 37 38np.random.seed(110) 39 40df = make_data(100) 41print(solve2(df))# (440805.0780829406, ['Name23', 'Name74', 'Name79', 'Name94']) 42print(solve1(df))# (440805.0780829406, ['Name23', 'Name74', 'Name79', 'Name94']) 43 44df = make_data(500) 45print(solve2(df))# (437755.98156119185, ['Name122', 'Name131', 'Name16', 'Name248']) 46#print(solve1(df))

投稿2022/12/09 05:10

can110

総合スコア36366

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

0

ベストアンサー

エクセルファイルを読み込ませようとしたのですが、FileNotFoundError: [Errno 2] No such file or directory: 'パンダ用.xlsx' と表示が出ました。

元のコードと実行環境(ファイル配置等)がわからないままでは,解決のしようがありません.
したがって,

この作業がPythonでできるのか疑問になってきました。

の方を解決すべくコードを例示します.

もとのデータは500行超あるため、並べあげるだけでスプレッドシートで扱える18278行を超過

仮にデータが500件だと仮定しても4つ選ぶ組み合わせ(Combinations)は
nCr = 500C4 = 500! / (4! x 496!) = 2573031125通りです.500件より多い場合は更に時間がかかることに注意してください.例えば現状の500件から600件に2割だけ増えたとしても5346164850組あるので約10割もの処理時間増加になります.
組み合わせ列挙はPython標準のモジュールitertoolsを利用して解決します.

Python

1import pandas as pd 2from itertools import combinations 3 4df = pd.DataFrame({ 5 "列1": ['かめ', 'うさぎ', 'ねこ', 'ごりら', 'うぉんばっと', 'まんとひひ', 'ねずみ'], 6 "列2": [18897, 20312, 17557, 24416, 24282, 23890, 23768], 7 "列3": [0.6717759, 0.43125207, 0.621294404, 0.659812699, 0.31928901, 0.944748929, 0.445755777], 8}) # pd.read_excel()が成功すれば同じデータになるはず 9 10data = df.values 11 12mx, result = -1, None 13for row in combinations(data, 4): # 4つ選ぶ 14 value = sum([c1 for _, c1, _ in row]) * sum([c2 for _, _, c2 in row]) 15 if mx < value: 16 mx = value 17 result = [name for name, _, _ in row] 18 19print(result, mx) # ['かめ', 'ごりら', 'まんとひひ', 'ねずみ'] 247631.550049155 20 21# 3行短縮Ver. 22calc = lambda row: sum([c1 for _, c1, _ in row]) * sum([c2 for _, _, c2 in row]) 23result = max(combinations(data, 4), key = calc) 24print(f"{', '.join([name for name, _, _ in result])}: {calc(result)}") # かめ, ごりら, まんとひひ, ねずみ: 247631.550049155

エクセルファイルを適切に読み込めて,例示コードのdataと同等のものが得られたら,欲しい組み合わせも得られるでしょう.

投稿2022/12/08 19:55

編集2022/12/09 04:05
PondVillege

総合スコア1066

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Google スプレッドシート

Google スプレッドシートは、フリーで利用できる表計算ソフト。Webアプリのためインターネットに接続することで利用できます。チャートやグラフの作成のほか、シートを他のユーザーと共有したり、同時に作業を進めることも可能です。

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

Python

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

pandas

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