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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

2回答

1074閲覧

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

Coon

総合スコア2

Google スプレッドシート

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

Google Apps Script

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

Python

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

pandas

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

0グッド

1クリップ

投稿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
すべて最新だと思います。

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

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

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

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

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

meg_

2022/12/08 16:55

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

2022/12/09 11:29

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

回答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

総合スコア38266

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

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

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

総合スコア1579

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問