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

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

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

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Q&A

解決済

1回答

510閲覧

ある行の数値が0以外の列名を取り出し,その列名が2つ以上ある場合,列名の2つの全組み合わせをカウントしたい

tatsukun

総合スコア1

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

0グッド

0クリップ

投稿2021/11/16 02:55

###ある行の数値が0以外の列名を取り出し,その列名が2つ以上ある場合,列名の2つの全組み合わせをカウントしたい

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

やり方の手順がわからない

該当のソースコード

CardN 0 1 2 3 4 5 6 7 8 FC301 2 0 0 0 1 0 0 0 3 ### 試したこと 0から8の全組み合わせを作ってからそこにカウントしようとしたが,listは作れたがそこからどうすればいいのかわからない。 ### 補足情報(FW/ツールのバージョンなど) spyder(python3.8)

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

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

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

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

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

guest

回答1

0

ベストアンサー

この質問では問われていませんが組み合わせを表す(0,4)などのタプル自体も使う予定があるのであれば、 itertools の combinations を使うとよいかと思います。

python3

1from itertools import combinations 2 3values = [2, 0, 0, 0, 1, 0, 0, 0, 3] 4non_zero_indexes = [i for i, v in enumerate(values) if v != 0] # => [0, 4, 8] 5 6count_of_pairs = len([*combinations(non_zero_indexes, 2)]) 7 8print(count_of_pairs)

実行結果:

3

単に組み合わせの数を求めるのであれば、itertools.combinationsを使わなくても、n 個のうち r 個をとる組み合わせの数が、
nCr = n(n-1)(n-2) ・・・ (n-r+1) ÷ r!
であることを使えば、特に r = 2 のときは、r! = 2! = 2 となり、
nC2 = n(n-1) ÷ 2
という簡単な式で求められるので、以下で算出できます。

python3

1values = [2, 0, 0, 0, 1, 0, 0, 0, 3] 2non_zero_indexes = [i for i, v in enumerate(values) if v != 0] # => [0, 4, 8] 3 4n = len(non_zero_indexes) 5count_of_pairs = int(n * (n-1) / 2) 6 7print(count_of_pairs) 8

実行結果:

3

投稿2021/11/16 03:42

編集2021/11/16 04:14
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

tatsukun

2021/11/16 04:16

kilesaさんありがとうございます。 コードのvaluesのところなんですが実際やりたいデータには行が複数あり,数字を打ち込まずその行全体としたいのですがいい方法はありますか?
退会済みユーザー

退会済みユーザー

2021/11/16 04:27

なるほどですね。こうすればよいかと思います。 (1) 上記の回答に書いたコードを関数にする  たとえば、def get_count_of_pairs(values) のような関数にして、この関数は  引数として各行のデータのリスト(例: [2, 0, 0, 0, 1, 0, 0, 0, 3])を受け取り、  題意の組み合わせの数(例: 3)を返します。 (2) 対象のエクセルファイルを読み込み、行ごとにループさせるプログラムを書く  (3) 上記(2) の各ループの中で、各行ごとにデータのリストを作り、それを  (1) の関数 get_count_of_pairs(values) に渡して実行することで、  各行の count_of_pairs を得る 作業の計画として、こういうときは、(1) と (2) の2つの作業を、まずは別個の作業として進めて、両方がある程度うまくいくものに仕上がったところで、合わせるとうまくいくと思います。
tatsukun

2021/11/16 04:56

ありがとうございます.流れについては理解出来ました.最終的にはすべての行で列の組み合わせの(0,1)は何個,(0.2)は何個のように数えたいと思ってます.この場合は上のcombinationsをつかってすすめたほうがいいですよね?
退会済みユーザー

退会済みユーザー

2021/11/16 05:13

はい。それであれば、combinationsを使うほうですね。 各行を処理するループに入る前にカウンターのdict なりを用意しておいて、行ごとの処置ではcombinations を使って、(0,4),(0,8),(4,8) のように全ての組み合わせを得て、これによって各(x, y) をキーとしてカウンターの値をインクリメントしていく、といった流れになるかと思います。
tatsukun

2021/11/16 07:33

combinationsをつかったほうも実行結果は3となってるんですが組み合わせについても得られてはいるんですよね?
退会済みユーザー

退会済みユーザー

2021/11/16 07:59

はい。回答に書いたコードは、元のご質問である、組み合わせの数の 3 を得るためのコードです。 各組み合わせを列挙するには、以下で得られます。 from itertools import combinations values = [2, 0, 0, 0, 1, 0, 0, 0, 3] non_zero_indexes = [i for i, v in enumerate(values) if v != 0] for pair in combinations(non_zero_indexes, 2): print(pair) 上記を実行すると (0, 4) (0, 8) (4, 8) と表示されます。
tatsukun

2021/11/16 08:36

このコードで実行してみたところprint(pair)のところでExpected an indented blockというエラーが出手しまいました。
退会済みユーザー

退会済みユーザー

2021/11/16 09:03

このコメント欄では、インデントが正しく挿入されているコードをコピペしても行頭が揃って しますようですね。 print(pair) の行頭には1個のインデント(タブ)が必要です。
tatsukun

2021/11/16 09:18

解決しました。
tatsukun

2021/11/17 01:04

def get_count_of_pairs(values): non_zero_indexes = [i for i, v in enumerate(values) if v != 0] for pair in combinations(non_zero_indexes, 2): return pair pair=get_count_of_pairs(2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0) 次のような関数を作って試してみたのですが次のエラーが出てしまって回りません. TypeError: get_count_of_pairs() takes 1 positional argument but 39 were given 因数の数が合わないとよく出るそうで,第1因数にselfを入れて試しましたが治りませんでした.
退会済みユーザー

退会済みユーザー

2021/11/17 02:21 編集

2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0 を囲んでリストにする [ と ] が抜けてますね。 get_count_of_pairs([2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0]) としてみるとどうでしょう?
tatsukun

2021/11/17 02:36

うごきましたが(0,18)の1ペアしか出てきませんでした。
退会済みユーザー

退会済みユーザー

2021/11/17 02:39

> うごきましたが(0,18)の1ペアしか出てきませんでした。 なるほどですね。その不具合については、現状のソースコード全体を掲載した新たな質問として投稿されるとよろしいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問