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

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

ただいまの
回答率

91.00%

  • Python 3.x

    4108questions

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

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

受付中

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 145

syen2501

score 15

実装したいこと

実装したい事としては、下記の表の「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」になっている列を抽出するところまで行った。

コード

import pandas as pd
import itertools
pd.set_option('display.unicode.east_asian_width',True)

front_table = {
     '操作':['ボタン','ビデオ','静止']
}

expected_value = [
    ['ボタンを押す'],
    ['ビデオモードにする'],
    ['静止する']
}

#表側,表頭を指定して、それに対応した期待値を抽出
class Table:
    def __init__(self, row_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]

table = Table(front_table['操作'],expected_value)
dat = table.get_datum('電源ボタン')
#print(dat)


#真偽のマーク
true_mark = 'T'
false_mark = 'F'

#真偽の組み合わせを網羅的に行う
def combination_TF(front_table):
    table_index = front_table
    combination = itertools.product(*([true_mark,false_mark],)*len(table_index))

    dataTF = [[] for i in range(len(table_index))]
    for com in combination:
        for element_count,authenticity in enumerate(com):
            dataTF[element_count].append(authenticity)
    return (dataTF, table_index)

data, conditions = combination_TF(front_table['操作'])
df = pd.DataFrame(data,index=conditions)
print(df)

#全ての行で「T」になっている部分の列の場所を抽出
columns_data = [[] for j in range(len(front_table['操作']))]

for index_number in range(len(front_table['操作'])):
    for columns_number in range(len(df.columns)):
        if df[columns_number][index_number] == 'T':
            columns_data[index_number].append(columns_number)
print(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]]


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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

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

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

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

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

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

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

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

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

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

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

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

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

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

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

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

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

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/24 22: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]
    を追加して考えようと思っています。

    キャンセル

  • 2017/09/25 01:45 編集

    表示について聞きたかったのですが。。「条件に対応した期待値を取り出す」(https://teratail.com/questions/92945)のhtml文書内テーブルみたいに表示したい、ということでしょうか?同質問ではTが一つかどうかはわかってないみたいですから、それがわかれば良いということでしたら、ちょっと取り組んでみようと思います。ついでに出来れば上記機能も使ってみますね

    もしかしたらすぐにはできないかもしれないので、もし先に完成させることができたのでしたら自己回答後容赦なく解決済みにしちゃってください。m(_ _)m

    追記:似たような質問をされていますので、新しい回答はそちらでさせていただきます。m(_ _)m
    回答後は一応こっちにも連絡入れます。

    キャンセル

  • 2017/09/25 01:58

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

    キャンセル

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

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • Python 3.x

    4108questions

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