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

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

ただいまの
回答率

90.47%

  • Python

    8609questions

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

  • 機械学習

    715questions

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

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

解決済

回答 4

投稿 編集

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

kokosei

score 5

例えば以下のコードで、

import pandas as pd

dataset = pd.read_csv('train.csv')

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

イメージ説明

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

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

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

イメージ説明

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

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

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

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

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • kokosei

    2018/05/09 08:49 編集

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

    キャンセル

  • kokosei

    2018/05/09 08:52

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

    キャンセル

回答 4

+3

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

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


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

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

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

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

checkベストアンサー

+2

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]と読み替えられて「ビット演算のように動作するんだろうなぁ」と無理やり納得することはできなくもないと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

こういうときのキモは、

  • 原則内側から評価される
  • 原則左側から評価される
    の2点です。
dataset[dataset['Survived']==1]['Pclass'].value_counts()

これがどんな順番で評価されるのかというと、

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

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+1

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

print("### dataset")
print(dataset)
print("### dataset['Survived']")
print(dataset['Survived'])
print("### dataset['Survived']==1")
print(dataset['Survived']==1)
print("### dataset[dataset['Survived']==1]")
print(dataset[dataset['Survived']==1])
print("### dataset[dataset['Survived']==1]['Pclass']")
print(dataset[dataset['Survived']==1]['Pclass'])

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

関連した質問

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

  • Python

    8609questions

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

  • 機械学習

    715questions

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