未分類」カテゴリーアーカイブ

PythonプログラミングでCSVファイルを開くときの文字コードエラーへの対処方法 UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0x89 in position 0: invalid start byte

【問題】PythonのJupyther Notebookでスクリプトを使ってエクセルファイルやCSVファイルを読もうとしたら、UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0x89 in position 0: invalid start byteというエラーが出ました。

【解決】エクセルファイルとCSVファイルでは文字コードが異なっていたようです。

if file.endswith(‘.xls’) | file.endswith(‘.xlsx’):
data = pd.read_excel(file, encoding = “shift-jis”)
elif file.endswith(‘.csv’) :
data = pd.read_csv(file, encoding = “cp932”)

とファイルの拡張子によって指定する文字コードも変えてやったら、問題なく読んでくれました。

 

pyothonでpandasのシリーズ(Series)の特定の要素のインデックスを取得する方法

シリーズの中のある要素が何番目かを知る方法。

 

#シリーズの中の特定の要素のインデックスを取得する方法

from pandas import Series

my_list = ['cell','gene','molecule','DNA','RNA']#リストの作成
my_series = Series(my_list)#リストからシリーズを作成
my_series[my_series=='DNA'].index[0]#特定の要素のインデックスを取得

 

上のコードを実行すると出力される結果は、3になります。DNAという文字列からなる要素が3番目(0から数え始めて)にあるので、3というわけです。

pythonのpandasのDataFrameで新しい列のデータを加える方法

pandasのDataFrameが以下のようになっていたとします。

import pandas as pd

dic ={ '名前' : ['太郎','花子','奈津子','夏子','なつみ'],
'数学' : [200,195,30,160,70],
'英語' : [120,180,90,161,111]}

df = pd.DataFrame(dic)

dfは、

名前 数学 英語
0 太郎 200 120
1 花子 195 180
2 奈津子 30 90
3 夏子 160 161
4 なつみ 70 111

ここに、列を挿入するには、

df.insert(1,'理科',[80,100,50,43,21])

とすれば、0列目の右側の1列目の位置に新しい列データを挿入できます。その結果、新しいデータフレームdfの内容は、

名前 理科 数学 英語
0 太郎 80 200 120
1 花子 100 195 180
2 奈津子 50 30 90
3 夏子 43 160 161
4 なつみ 21 70 111

となりました。

 

リストの要素の文字列が特定の文字で始まるときにその特定の文字を除去する方法

pythonで語句のリストがあったとき、特定の文字で始まる語句に関してその特定の文字を除去したいことがありあす。例えば、一部の語句はTheで始まるpythonのリスト [‘The pen’,’desk’, ‘The ink’]の場合に、どうやってこの中のTheを除去すればよいでしょうか。

以下のコードで実現できました。

# リストの要素の文字列がTheで始まる場合はそれを除去する

list = ['The pen','desk', 'The ink']
new_list = []

for element in list:
if element.startswith('The '):
sub0,sub1 = i.split('The ',1)
new_list = new_list+[sub1]
else:
new_list = new_list+[i]

print(list)
print(new_list)
動作の説明ですが、新しいリストを準備しておきます。

new_list = []

forループでリスト内の要素を一つずつチェック。’The ‘で始まる場合とそうでない場合で処理を分けます。’The ‘で始まる文字列に関しては、’The ‘の前後に分割。前は何もないのでカラの文字列になります(sub0)。後ろが自分が欲しい文字列(sub1)。sub1はストリングのデータタイプはストリングなので[]でリストにしてから、+という演算子でリスト同士を合わせます。上のコードを実行した結果は、

['The pen', 'desk', 'The ink']
['ink', 'The ink', 'ink']

で、うまく期待した動作をしてくれました。

註:このブログの記事内では、インデントがなくなってしまっています。forループの中身にはインデントが必要。さらにその中のif文およびelse文の中身もインデントが必要です。

TypeError: read_excel() got an unexpected keyword argument ‘encoding’ というエラーが出るようになってしまった

以前は動いていたコードなのに、今回実行したらなぜか

TypeError: read_excel() got an unexpected keyword argument ‘encoding’

というエラーが出てしまいます。pandasのバージョンがいつのまにかアップグレードされていて、使えなくなったということなのでしょうか。ネットを調べたら、やはり、以前のバージョンではOKだったみたいです。

I know that Providing encoding as a keyword argument is unnecessary and only “worked” before so what is the alternative of encoding in pandas 1.2.3 that i can use. https://stackoverflow.com/questions/69015459/read-excel-not-accepting-encoding-on-pandas-1-2-3

とりあえず、その部分を削除したら問題なく動作しました。

 

pd.ExcelFile(file)でエラー ValueError: Max value is 14

pandasのエクセルを読み込むコマンド

pd.ExcelFile(file)

を使って、PDFの表をエクセルに保存したものを読みこもうとしたら、

ValueError: Max value is 14

というエラーになってしまいました。エラーコードを自分が見ても全く理解できないので、あれこれ試行錯誤したのですが、結果的に、エクセルのファイルの中身をコピーアンドペーストで一度、シンプルエディタ(ウインドウズの「メモ帳」)に張り付けて、そこからコピーアンドペースとで新規作成したエクセルファイルに張り付けました。それを保存して、読み込ませたら読めました。おそらく文字に何か、眼に見えないフォーマットがへばりついていたのではないかと想像します。解決方法としては邪道ですが、作業を先に進めることができるのでよしとします。

関数を呼び出す行で 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