###前提
python
1import pandas as pd 2df #データフレーム
###分からないこと
df.dtype
やdf.columns
は()を使わずに用います。
一方で例えば
df.isnull()
やdf.sum()
は()を使わないといけません。
この違いは一体どこにあるのでしょうか?前者は関数ではなく、モデュール?など想像していますが、いまいち答えがわかりません。何かヒントを教えて頂けませんでしょうか。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答3件
0
ベストアンサー
#プロパティ
df.dtypes
やdf.columns
が()を使わずに用いることができるのは、それらがプロパティとして実装されているからです。
プロパティとして実装されていることによって、コード上、あたかも属性を直接扱うかのように代入や読み取りができる一方、代入や読み取りの際に、関数と同様に、たとえば値のチェック等、付随する処理も行うことが可能です。
だとえばdf.columnsに、変なラベルを代入しようとすると例外が出ます。
プロパティとは、かんたんにいえば、pythonにおいては、下記のような、オブジェクトのデータの読み込みや書き込みを制御するためのスマートな仕組みです。(JavaやC#など他の主要なプログラミング言語でも大抵似たような仕組みはあります)
class Car: def __init__(self): self._gear = 1 @property def gear(self): return self._gear @gear.setter def gear(self, v): if not isinstance(v,int): raise ValueError if v > 6: self._gear = 6 elif v < 1: self._gear = 1 else: self._gear = v
これはCar
というクラスに対して、gearというプロパティを設定しているごく単純な例です。
def関数の前に@propertyと、@属性名(gear).setterというデコレータをつけています。
使い方の例として
mycar = Car() print(mycar.gear) mycar.gear+=1 print(mycar.gear) mycar.gear+=9 print(mycar.gear) mycar.gear = "ギア1" print(mycar.gear)
とすると、1,2,6と表示され、最後はValueErrorが発生します。
初期状態ではギアが1,
次はギアを1段階上げるので2になります。
(ここまでは、単なるCarクラスのインスタンス属性としてgearを作った場合と変わりません)
次でさらに9段階上げようとしてますが、@setter内でギアの上限がチェックされているため、
(安全に)6までしかギアが上がりません。
また、文字列をギアに設定しようとすると、@setter内で例外を発生させています。
このようにプロパティを使うことで、あたかもの属性を直接操作するようにコードを書くことができる一方で、代入時のチェックを実現してます。
@getterや@ deleterを使うことで読み取り時や削除時の処理も記述できます。
関数
関数を呼び出すときは引数とともに()をつけます。
引数を省略することもできますが、()は省略できません。
df.isnull()
やdf.sum()
はそれぞれ、
・nullかどうかチェックして真偽値を返す、
・データフレーム内のデータの合計という処理を行って、合計値を返す
という純粋な処理なので、関数として定義されているものと思われます。
使い分けの基準
もちろん上記のdtypesやcolumnsも、
df.dtypes()
df.columns()
みたいに関数として定義することも可能なはずです。
しかし、pandasの偉い人たちはそういうアプローチはとっていません。
これは、
dtypes(型の一覧)やcolumns(列の一覧)は、処理というよりも、より「属性」に近いものであるから
ではないかと勝手に推測してます。
逆にdf.isnull()
やdf.sum()
は「処理」としての色合いが濃いので、関数として定義されているんじゃないでしょうか。
(もちろん「sumはデータフレーム内の集合に関するものだからデータフレームの属性っぽいものじゃないか」とか「dtypesは型を列挙して返すから処理ともいえるじゃないか」いう意見もあるかもしれませんが)
投稿2020/08/26 15:51
編集2020/08/27 05:03総合スコア1137
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
関数ではないから()をつけないだけです
関数を実行させるには、関数名の後ろにカッコを付け、必要ならそこに引数を列挙します
投稿2020/08/26 14:26
編集2020/08/26 14:28総合スコア88042
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。