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

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

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

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

Q&A

1回答

230閲覧

dataframeで指定した列に値を代入したい

syen2501

総合スコア38

Python 3.x

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

1グッド

1クリップ

投稿2017/09/22 07:44

#実装したいこと
実装したい事としては、下記の表の「T」と「F」の組み合わせから、
条件にあった「列」の値を取り出し、その列上に期待値を出したい。
例として下記のような感じ。

ボタンが「T」だったらアクション1の「ボタンを押す」が
列上「3」のところに出るというのを実装したい。

例) 0 1 2 3 4 5 6 7 ボタン T T T T F F F F ビデオ T T F F T T F F 静止 T F T F T F T F アクション1 ボタンを押す アクション2 アクション3

#やったこと
条件から「T」と「F」の条件を網羅的に表示し、全ての行で「T」になっている列を抽出するところまで行った。

#コード

python

1import pandas as pd 2import itertools 3pd.set_option('display.unicode.east_asian_width',True) 4 5front_table = { 6 '操作':['ボタン','ビデオ','静止'] 7} 8 9expected_value = [ 10 ['ボタンを押す'], 11 ['ビデオモードにする'], 12 ['静止する'] 13} 14 15#表側,表頭を指定して、それに対応した期待値を抽出 16class Table: 17 def __init__(self, row_names, data): 18 self.row_names = row_names 19# self.column_names = column_names 20 self.data = data 21 22 def get_datum(self, row_name): #column_name): 23 row_index = self.row_names.index(row_name) 24# column_index = self.column_names.index(column_name) 25 26 return self.data[row_index] 27 28table = Table(front_table['操作'],expected_value) 29dat = table.get_datum('電源ボタン') 30#print(dat) 31 32 33#真偽のマーク 34true_mark = 'T' 35false_mark = 'F' 36 37#真偽の組み合わせを網羅的に行う 38def combination_TF(front_table): 39 table_index = front_table 40 combination = itertools.product(*([true_mark,false_mark],)*len(table_index)) 41 42 dataTF = [[] for i in range(len(table_index))] 43 for com in combination: 44 for element_count,authenticity in enumerate(com): 45 dataTF[element_count].append(authenticity) 46 return (dataTF, table_index) 47 48data, conditions = combination_TF(front_table['操作']) 49df = pd.DataFrame(data,index=conditions) 50print(df) 51 52#全ての行で「T」になっている部分の列の場所を抽出 53columns_data = [[] for j in range(len(front_table['操作']))] 54 55for index_number in range(len(front_table['操作'])): 56 for columns_number in range(len(df.columns)): 57 if df[columns_number][index_number] == 'T': 58 columns_data[index_number].append(columns_number) 59print(columns_data)

#実行結果

0 1 2 3 4 5 6 7 電源ボタン T T T T F F F F ビデオボタン T T F F T T F F 静止ボタン T F T F T F T F [[0, 1, 2, 3], [0, 1, 4, 5], [0, 2, 4, 6]]

分かりにくいかもしれませんが、よろしくお願いいたします。

退会済みユーザー👍を押しています

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

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

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

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

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

guest

回答1

0

以前の回答依頼に回答できずすみません。。m(_ _)m

その列上に期待値を出したい。

っていうのをどういう風に出したいかがいまいちわかりませんでしたが、

もし('T','F','F')みたいにTが一つだけのときに実行される期待値を表示し、その際列番号も記載する、ということでしたら、こんな感じでしょうか?

以下掲載していただいたコードの下に続けてください。

lang

1for i,col in enumerate(zip(*data)): # i => 列番号 col => 列 2 if len([b for b in col if b=="T"])==1: # Tが列中で一つなら 3 for j,row in enumerate(data): # j => 行番号 row => 行 4 if row[i]=="T": # Tの時に列番号と、行番号から得られる操作を表示 5 print("col "+str(i)+" : "+str(table.get_datum(table.row_names[j])[0]))

実行結果(上記コードの部分のみ)

col 3 : ボタンを押す col 5 : ビデオモードにする col 6 : 静止する

自分的にはちょっとわかりにくくなってしまったかなぁという感じです。
もうちょっと内包表記でなんとかなればよかったんですけど苦笑

ちなみにzip関数は私は初めて使いました。(^ ^;

投稿2017/09/22 17:07

編集2017/09/22 17:11
namnium1125

総合スコア2043

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

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

syen2501

2017/09/24 13:19

回答ありがとうございます。 分かりにくくて申し訳ありません。 自分としては、最終的に、 0 1 2 3 4 5 6 7 電源ボタン T T T T F F F F #表側 ビデオボタン T T F F T T F F #表側 画面表示中 T F T F T F T F #表頭 ーーーーーーーーーーーーーーーーーーーー アクション1 「電源をオフする」  #列「3」 というように表側と表頭の「T」「F」の組み合わせから それに応じた期待値(アクション)を取り出す。 上記のコードに、 table_head{    '期待動作':['画面表示中'] } を追加し、 Tableクラスとその中の関数のget_datamを class Table: def __init__(self, row_names, column_names, data): self.row_names = row_names self.column_names = column_names #追加 self.data = data def get_datum(self, row_name, column_name): row_index = self.row_names.index(row_name) column_index = self.column_names.index(column_name) #追加 return self.data[row_index][column_index] を追加して考えようと思っています。
namnium1125

2017/09/24 16:45 編集

表示について聞きたかったのですが。。「条件に対応した期待値を取り出す」(https://teratail.com/questions/92945)のhtml文書内テーブルみたいに表示したい、ということでしょうか?同質問ではTが一つかどうかはわかってないみたいですから、それがわかれば良いということでしたら、ちょっと取り組んでみようと思います。ついでに出来れば上記機能も使ってみますね もしかしたらすぐにはできないかもしれないので、もし先に完成させることができたのでしたら自己回答後容赦なく解決済みにしちゃってください。m(_ _)m 追記:似たような質問をされていますので、新しい回答はそちらでさせていただきます。m(_ _)m 回答後は一応こっちにも連絡入れます。
syen2501

2017/09/24 16:58

ありがとうございます。何度も同じ質問をしてしまい申し訳ありません。 分かりにくいと思いますが、回答していただいて本当に感謝しています。 html文書内のテーブルみたいに表示したい、ということで良いです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問