月別アーカイブ: 2021年3月

関数を呼び出す行で TypeError: ‘str’ object is not callable のエラーが発生【解決】

さっきまで動いていたのに、ちょっと変えたらTypeError: ‘str’ object is not callable が出て困ってしまいました。ググったら、変数名がぶつかっているとかいろいろ。自分が心当たりがあったのは、

a = -1

a = 関数の戻り値

と、コードをテストする都合上、使い分けていたことです。片方をコメントアウトしても、だめだったのかも。jupyter notebook かanaconda3か、前のを覚えているため、コードを書き直したとしてもエラーが取れないというのを見かけて、自分もノートを閉じてanaconda3も一度終了してから、起動しなおしてみました。そうするとあっさり解決。エラーが出なくなりました。

 

何が理由かはっきりわかりませんが(自分の場合、関数名と変数名がだぶっていたというわけではないので)。

anaconda3 (python3)へのplotlyのインストール

Pythonデータビジュアライゼーション入門 コードと連動してわかる可視化手法 という本を読んでいたら、サンプルコードを動かすのにいくつかのモジュールが必要でした。pythonモジュールのインストールは通常、Anacondaの画面からやっています。しかしplotlyをインストールしようとしたらエラーが出て、なぜかうまくいきませんでした。

 

そこで、方針を変えることにしました。

 

ANACOND NAVIGATORのパネルの左側のメニューでEnvironmentsを選び、base(root)の三角印をクリックするとプルダウンメニューが現れるのでその中からOpen with Pythonを選びます。すると、ターミナルウインドウが現れて、pythonのコマンドが使えます。そこで、

pip install plotly

と入力してエンターキーをヒット。しばらく待ったら、無事インストールできました。foliumも同様に、

pip install folium

としてやると、サクッとインストールに成功しました。なぜanacondaの環境でやろうとしてできなかったことが、コマンドウインドウからやるとできたのかは謎です。

python pandas DataFrameの取り扱いの忘備録

DataFrameは便利と言われていますが、自分はいつもやり方を忘れて四苦八苦するので、忘備録。

データフレームの生成

 

pythonでは、リストは、四角い括弧[ ] で括って、カンマ(,)で区切ったもの。

リストの例 [2011,2012,2013]

ディクショナリは、ラベルがついたリストで、弓型の括弧で囲まれたもの

ディクショナリの例 {‘Year’:[2011,2012,2013]}

キーが、データフレームにしたときの列の名前になります。

 

# データフレームの取り扱いを纏めておく

from pandas import DataFrame
import pandas as pd

dict1 = {‘Year’:[2011,2012,2013], ‘A’:[ 1, 3, 2], ‘B’:[5,6,4], ‘C’:[8,7,9]}

df1 = DataFrame(dict1)
print(df,’\n’)
print(‘dfがデータフレーム型であることの確認 type(df) ‘,type(df))

 

実行結果の出力は

   Year  A  B  C
0  2011  1  5  8
1  2012  3  6  7
2  2013  2  4  9 

dfがデータフレーム型であることの確認 type(df)  <class 'pandas.core.frame.DataFrame'>


 

データフレームから列を取得する方法

 

列を取り出すには列の名前で指定できます。

 

#データフレームから列を取りだす方法
print(‘データフレーム df:’,’\n’,df,’\n’)
print(‘Aの1列を取りだす df.A’,’\n’)
print(df.A,’\n’)
print(‘Yearの1列を取りだす df.Year’)
print(df.Year,’\n’)
print(“2つの列を名前で取りだす df[[‘A’,’Year’]]”)#  ‘を内部の文字列として扱いたいときは外側を” ” で
print(df[[‘A’,’Year’]],’\n’)

2つのデータフレームを並べて合わせる方法 .joinを使う

データフレームを2つ合体させる方法。appendとかmergeとか似たような命令がいくつかあって悩みましたが、自分がやりたかったことはjoinでできました。

# データフレームの右側に別のデータフレームを付け足す方法

今の場合’Year’のカラムが両方にあってダブってしまうため、付け足されるほうのデータフレームからは予め削除(drop)しておきます。axis=1というのは「列」という意味。axis=0だと「行」の指定。

# データフレームの右側に別のデータフレームを付け足す方法
dict1 = {'Year':[2011,2012,2013], 'A':[ 1, 2,3],    'B':[4,5,6],    'C':[7,8,9]}
dict2 = {'Year':[2011,2012,2013],'D':[ 10, 11,12], 'E':[13,14,15], 'F':[16,17,18]}

print('1つめのデータフレーム\n',DataFrame(dict1),'\n')
print('2つめのデータフレーム\n',DataFrame(dict2),'\n')
print('2つめを1つめの右に合わせたもの\n', DataFrame(dict1).join(DataFrame(dict2).drop('Year', axis=1)),'\n')

 

出力結果は、

1つめのデータフレーム
    Year  A  B  C
0  2011  1  4  7
1  2012  2  5  8
2  2013  3  6  9 

2つめのデータフレーム
    Year   D   E   F
0  2011  10  13  16
1  2012  11  14  17
2  2013  12  15  18 

2つめを1つめの右に合わせたもの
    Year  A  B  C   D   E   F
0  2011  1  4  7  10  13  16
1  2012  2  5  8  11  14  17
2  2013  3  6  9  12  15  18 

DataFrameの特定の列の値に基づいて行を並べ替える方法 KeyError:の解決

DataFrameの特定の列の値に基づいて行を並べ替えたいと思ったのですがKeyError:が出て苦労したので、解決したいきさつをメモしておきます。自分の扱ったデータは、カラム(列)が年度、行が人名で、データは数字です。個人個人のとある数値データの年推移をまとめたものです。

解決のきっかけは、このサイトの記事。

  1. 【Pythonエラー】Pandas Dataframeカラム名指定でKey Error→カラム名確認して原因特定 Qiita @kath_y 2019年07月25日

カラム名に、目に見えない(表示されない)空白文字があったからというものでした。print(df.columns) でカラム名の確認からやっていました。この人の結果は、

Index([‘sepal length (cm)’, ‘sepal width (cm)’, ‘petal length (cm)’, ‘petal width (cm)’], dtype=’object’)

自分も試してみたところ、

Int64Index([2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020], dtype=’int64′, name=’Year’)

となりました。ちなみに、目でみたところはカラム名は、’2011′, ‘2012’, のように文字列だと思っていました。なので、

df.sort_values(by=[‘2012’])

で良いのだろうと思ったのですが、

KeyError: ‘2012’

となって途方に暮れていました。上のチェックでわかったことは、カラム名が文字列としての数字ではなく、本当に数字、つまりインテジャー(整数)だったということ。ならばと思って、

df.sort_values(by=[2012],ascending=False)

と数字をそのまま放りこんだらうまく期待した動作をしてくれました。ascending=False 昇順じゃないよということで降順にする指定方法。2012という名前のカラム(列)の値が降順になるように、行を入れ替えるという動作になります。

文字列を要素とするリストにおいて、空の要素を除く方法 リスト内包表記をマスター

文書の処理をpythonでやっているときに、文字を何も含まない要素がリストの中に紛れ込むことがありました。それを除く方法を調べてみました。

何も含まない要素を含むリストを作って試します。

mylist = [”,’a’,”]
print(mylist)

mylist = [i for i in mylist if i != ”]
print(mylist)

結果は

['', 'a', '']
['a']

となり、うまく除去できています。このfor文の使い方は、知らないと絶対に思いつかないと思いますが、慣れればとても便利な方法です。条件の内容を変えることにより、応用範囲が広がります。

[iに関する式 for i in リスト] という構造になっていて、リストの各要素に関してiに関する式であらわされる新しい要素からなるリストを作っています。これはリスト内包表記と呼ばれるみたいです。

リスト内の要素に関して条件を付けたければ、

[iに関する式 for i in リスト if 条件]

という書式になります。このやり方を覚えておくと、リスト内の要素の抽出や加工の際にとても便利。

jupyterノートブックでコードの全てをコメントアウトする方法?

疑問:jupyterノートブックでコードの全てをコメントアウトする方法?(ウインドウズ10で利用時)

回答:コメントアウトしたい部分を選択しておき、Ctlキーと/キーを同時に押す。ちなみに、同じ操作をもう一度やると、今度はコメントを除くことができる。

.str.containsを使おうとするとValueError: cannot index with vector containing NA / NaN valuesのエラーになる件【解決】

df[‘データフレームの列の名前’].str.contains(“調べたいキーワード”)という構文を使おうとしたら、

ValueError: cannot index with vector containing NA / NaN values

というエラーを食らいました。解決法は簡単で、

na=False

という指定を足してやればよかっただけでした。

df[‘データフレームの列の名前’].str.contains(“調べたいキーワード”, na=False)

で事足りました。ちなみにもしna=Trueと指定すると、NaNの行は、Trueつまり、”調べたいキーワードがあったこと”として扱われるようです。

 

参考にしたサイト

  1. pandas データフレームをstr.contains()で処理し、nan値を無視したい (2018/01/11 15:41 teratail.com 質問をすることでしか得られない、回答やアドバイスがある。)
  2. pandasで特定の文字列を含む行を抽出(完全一致、部分一致)https://note.nkmk.me/

リスト内包表記で複数の条件を用いるときの書式

リスト内包表記は非常に便利で、様々な条件に適合する要素だけをリストから抽出することができます。一つの条件だけでなく、複合条件を適用することもできるようです。

所属リスト = [‘東京大学医学部’, ‘京都大学医学部’, ‘東京大学理学部’, ‘東京大学’, ‘東京大学病院’]
東大医 = [s for s in 所属リスト if (‘東京大学’ in s) and ((‘医学部’ in s) or (‘病院’ in s)) ]
print(東大医)

 

出力結果は、

 

[‘東京大学医学部’, ‘東京大学病院’]

 

となりました。

 

参考

  1. Pythonで文字列のリスト(配列)の条件を満たす要素を抽出、置換(nkmk)