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

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

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

4回答

332閲覧

Pandasの書き方について、直感的な理解ができない

kokosei

総合スコア13

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

2グッド

1クリップ

投稿2018/05/08 14:35

編集2018/05/08 14:43

例えば以下のコードで、

python

1import pandas as pd 2 3dataset = pd.read_csv('train.csv')

datasetが以下のような表になるとします。

イメージ説明

この時下記のような変数を定義すると、

python

1survived_class = dataset[dataset['Survived']==1]['Pclass'].value_counts() 2

survived_classは以下のようになります。

イメージ説明

前置きが長くなりましたが、以下質問させていただきたい内容です。
survived_classを定義する時の書き方が直感的に理解できません。

具体的には以下3点です。
・なぜ変数名datasetの後に[]を書いて、[]内の条件で絞り込みができるのか
・変数名datasetの後の[dataset['Survived']==1]について、なぜ[]の中にまた変数名があるのか(例えばdataset[Survived==1]等ならまだ腑に落ちる)
・その後に続く['Pclass']について、[]と[]が連続しているのはなぜか

こういうふうに書く決まりだからというのは分かるのですが、直感的な理解の仕方(直感的な覚え方)を知りたいと思っています。

どなたかアドバイスいただけませんでしょうか。よろしくお願いいたします。

tkmtmkt, hayataka2049👍を押しています

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

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

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

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

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

kokosei

2018/05/09 00:04 編集

みなさん、たくさんのご回答本当にありがとうございます。皆さんからのアドバイスにより、PandasのDataFrameはその構成単位?であるSeriesをベースに考えると分かりやすいということと、Seriesにアクセスするためにはブラケットを用いるということと、戻り値や引数の型を常に意識すること(Pandasに限りませんが)、の三点が直感的な理解の助けになると分かりました。
kokosei

2018/05/08 23:52

皆様全員のコメントを基に上記学ぶことができたのですが、特に疑問をクリアにしてくださったYouheiSakuraiさんをベストアンサーとさせていただきました。皆様本当にありがとうございました。
guest

回答4

0

直感的なコードではない理由のひとつとして少し技巧的だから、という気がします。例示のコードを素直に書くと以下のようになるはずです。

python

1survived_class = dataset[dataset['Survived']==1] 2tmp = survived_class['Pclass'] 3print(tmp.value_counts())

つまり、「所定の条件を満たす行を週出する→value_counts()を行いたい列を取り出す→取り出した列にvalue_countsを行って出力する」というものです。技巧的といったのは、この一連の処理を一行のコードにつなげ過ぎたためのような気がします。

本来であれば、.locというメソッドを使って「ある条件を満たす行のうち、指定した列を取り出す」という処理が書けます。これであれば、.locの機能がわかっていれば直感的のはずです。

python

1survived_class = dataset.loc[dataset['Survived']==1,'Pclass'].value_counts() 2

加えていうと、Survivedが1の場合のvalue_countsは行っていますが0の場合はどうするのでしょう。今のコードの書き方だと、同じ要領で0のコードを書くことになりそうです。仮にそうするのであれば、、pd.crosstab()を使ったほうがいいでしょう。これであれば、Survivedに指定されているコードを網羅してvalue_countsを行ってくれます。(クロス集計という形式になりますが…)
そのほうが、最終的にはわかりやすいコードになるように思いますので、いろいろと研究してください。

投稿2018/05/08 21:19

R.Shigemori

総合スコア3376

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

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

0

こういうときのキモは、

  • 原則内側から評価される
  • 原則左側から評価される

の2点です。

python

1dataset[dataset['Survived']==1]['Pclass'].value_counts()

これがどんな順番で評価されるのかというと、
0. dataset['Survived']のオブジェクトができる

  1. dataset['Survived']==1が評価されてbooleanのSeriesが返る
  2. dataset[booleanのSeries]が評価されてdatasetから一部だけ抽出したものになる
  3. datasetから一部だけ抽出したもの'Pclass'コラムを取り出す
  4. Seriesとして出てくるのでそのメソッドを呼ぶ

投稿2018/05/08 18:09

hayataka2049

総合スコア30933

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

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

0

ベストアンサー

PandasはPythonの文法の上にマジックがたくさん散りばめられているので、わからずともPandasではそう書くもんなんだと納得するのも一考です。(私はそうしてます。)

その前提で真面目に答えられる範囲で答えると、、、

  • まず、dataset[Survived==1]は、Survivedが未定義の状態ではPythonの文法的に通りません。
  • 次に、dataset["Survived"==1]は、dataset[False]と同義なのでPandas的に使い物になりません。
  • よって自然と、「dataset[Pandas的な何か]という書式でデータの絞り込みが行えるようにしよう!」となったんだと思います。
  • 最後に、dataset['Survived']==1はTrue/FalseからなるSeriesを返すので、dataset[dataset['Survived']==1]dataset[True/FalseからなるSeries]と読み替えられて「ビット演算のように動作するんだろうなぁ」と無理やり納得することはできなくもないと思います。

投稿2018/05/08 16:12

YouheiSakurai

総合スコア6142

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

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

0

私もPython初心者です。
まず最初に、1段階ずつ順番に見ていくというのはいかがでしょうか。
納得できる部分が少し増えるのではないかと思います。

Python

1print("### dataset") 2print(dataset) 3print("### dataset['Survived']") 4print(dataset['Survived']) 5print("### dataset['Survived']==1") 6print(dataset['Survived']==1) 7print("### dataset[dataset['Survived']==1]") 8print(dataset[dataset['Survived']==1]) 9print("### dataset[dataset['Survived']==1]['Pclass']") 10print(dataset[dataset['Survived']==1]['Pclass'])

投稿2018/05/08 15:35

miyu21

総合スコア111

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問