疑問:jupyterノートブックでコードの全てをコメントアウトする方法?(ウインドウズ10で利用時)
回答:コメントアウトしたい部分を選択しておき、Ctlキーと/キーを同時に押す。ちなみに、同じ操作をもう一度やると、今度はコメントを除くことができる。
疑問:jupyterノートブックでコードの全てをコメントアウトする方法?(ウインドウズ10で利用時)
回答:コメントアウトしたい部分を選択しておき、Ctlキーと/キーを同時に押す。ちなみに、同じ操作をもう一度やると、今度はコメントを除くことができる。
df[‘データフレームの列の名前’].str.contains(“調べたいキーワード”)という構文を使おうとしたら、
ValueError: cannot index with vector containing NA / NaN values
というエラーを食らいました。解決法は簡単で、
na=False
という指定を足してやればよかっただけでした。
df[‘データフレームの列の名前’].str.contains(“調べたいキーワード”, na=False)
で事足りました。ちなみにもしna=Trueと指定すると、NaNの行は、Trueつまり、”調べたいキーワードがあったこと”として扱われるようです。
リスト内包表記は非常に便利で、様々な条件に適合する要素だけをリストから抽出することができます。一つの条件だけでなく、複合条件を適用することもできるようです。
所属リスト = [‘東京大学医学部’, ‘京都大学医学部’, ‘東京大学理学部’, ‘東京大学’, ‘東京大学病院’]
東大医 = [s for s in 所属リスト if (‘東京大学’ in s) and ((‘医学部’ in s) or (‘病院’ in s)) ]
print(東大医)
出力結果は、
[‘東京大学医学部’, ‘東京大学病院’]
となりました。
データフレームの作り方はいろいろあります。既存のエクセルファイルを読み込んだり、リストの形になっているデータを読み込んだり。しかし、データがあとから生成される場合に、最初に「空」のデータフレームを作っておきたい場合もあります。行名、列名は指定して、値は全て0を初期値とするデータフレームの作り方。
import pandas as pd
行名 = [2016,2017,2018,2019,2020]
列名 = [‘Medicine’,’Science’]
df = pd.DataFrame(index=行名, columns=列名)for col in df.columns:
df[col].values[:] = 0
python3では日本語も変数名として使えるので、上のコードではそうしてみました。
dfの出力結果は、
| Medicine | Science | |
|---|---|---|
| 2016 | 0 | 0 |
| 2017 | 0 | 0 |
| 2018 | 0 | 0 |
| 2019 | 0 | 0 |
| 2020 | 0 | 0 |
となります。
タブ区切りのCSVファイルをpandasのread_table()メソッドを用いてデータフレームとして読み込もうとしたときに、
df = pd.read_table(file)
UnicodeDecodeError: ‘utf-8′ codec can’t decode byte 0x8c in position 62517: invalid start byte というエラーが出てしまい、にっちもさっちもいかなくなって困りました。ネットで見かけた解決策をあれこれ試しても全然効果なし。ところが、encoding=’unicode_escape’を付けてみたら、
df = pd.read_table(file, encoding=’unicode_escape’)
無事読み込めました。
pythonのpandasのデータフレームであれこれ処理した結果をエクセルファイルに保存したいことがあります。コードを実行するたびに名前を書き換えるのも大変なので、ファイル名は現在時刻を取得して使うことにします。
from datetime import datetime
from pandas import DataFrame
dic = {'numbers':[1,2,3]}
df = DataFrame(dic)
t = datetime.now()
current_time = t.strftime("%Y%m%d_%H%M%S")
df.to_excel(current_time+'_test.xlsx')
上のコードを実行すると、20210131_224944_test.xlsxというファイルが生成しました。エクセルで開くと中身は、
| numbers | |
| 0 | 1 |
| 1 | 2 |
| 2 | 3 |
となっていました。
太郎くんがバイト先のレストランで6人の客がいるテーブルで注文を受けたところ、コーヒー’, ‘紅茶’,’コーヒー’, ‘オレンジジュース’, ‘紅茶’,’コーヒー’でした。花子さんは、何がいくつあったかをpythonでわかりやすく集計したいと思いました。どんなコードを書けばよいでしょうか?
from collections import Counter
import pandas as pd
from pandas import DataFrame
飲み物注文リスト=['コーヒー', '紅茶','コーヒー', 'オレンジジュース', '紅茶','コーヒー']
個別アイテム数 = Counter(飲み物注文リスト)
df = pd.DataFrame.from_dict(個別アイテム数, orient='index').reset_index()
df = df .rename(columns={'index':'飲み物', 0:'数'})
df
上のようなコードを実行したところ、
| 飲み物 | 数 | |
|---|---|---|
| 0 | コーヒー | 3 |
| 1 | 紅茶 | 2 |
| 2 | オレンジジュース | 1 |
という結果が得られました。花子さんは、飲み物だけでなくメインディッシュの注文に関する情報も持っていました。メインディッシュに関しても、同様に集計するコードはどう書けるでしょうか。ただし、オーダーはpythonの辞書(dictionary)の形式で書かれているものとします。
オーダー={‘飲み物’:[‘コーヒー’, ‘紅茶’,’コーヒー’, ‘オレンジジュース’, ‘紅茶’,’コーヒー’],
‘メイン’:[‘ピザ’,’ピザ’,’ピザ’,’ピザ’,’パスタ’,’グラタン’]}
個別アイテム数 = Counter(オーダー['メイン'])
df = pd.DataFrame.from_dict(個別アイテム数, orient='index').reset_index()
df = df .rename(columns={'index':'食べ物', 0:'数'})
df
上のコードを実行してみると、
| 食べ物 | 数 | |
|---|---|---|
| 0 | ピザ | 4 |
| 1 | パスタ | 1 |
| 2 | グラタン | 1 |
と集計できました。めでたし、めでたし。
pythonのpandasのデータフレームは表タイプのデータ処理を行うのに便利ですが、列の長さが揃っている必要があります。列の長さ(要素の数)がバラバラの場合には、辞書の配列のほうが便利ということもあるかもしれません(多分)。
‘のびた’,’すねお’, ‘しずか’,’わかめ’,’かつお’,’ドラえもん’,’しんのすけ’,’まるこ’といった人々がいたときに、彼らを3組のクラスに振り分けることを考えます。あとあとの事を考えて、辞書の配列を作成して、振り分けを行うには、どんなコードを書けばよいでしょう?
クラス数 = 3
dictlist = [dict() for x in range(クラス数)]
for i in range(クラス数):
dictlist[i] = {'氏名': []}
人びと=['のびた','すねお', 'しずか','わかめ','かつお','ドラえもん','しんのすけ','まるこ']
for k in range(len(人びと)):
dictlist[k%クラス数]['氏名'].append(人びと[k])
dictlist
上のコードを実行した結果は、
[{'氏名': ['のびた', 'わかめ', 'しんのすけ']},
{'氏名': ['すねお', 'かつお', 'まるこ']},
{'氏名': ['しずか', 'ドラえもん']}]
となり、3組に振り分けることができました。クラスの人数にばらつきがあります。
上のタスクみたいに、リストの要素に関して繰り返し処理をする場合には、リストの要素のインデックスと要素の中身そのものの両方がが欲しい場合が頻繁にあります。 その場合には、enumerateという関数が便利。上と同じ処理をenumerateを使って書けば、同じ処理が、
for k, person in enumerate(人びと):
dictlist[k%クラス数]['氏名'].append(person)
となります。
クラス数 = 3
dictlist = [dict() for x in range(クラス数)]
for i in range(クラス数):
dictlist[i] = {'氏名': []}
人びと=['のびた','すねお', 'しずか','わかめ','かつお','ドラえもん','しんのすけ','まるこ']
for k in range(len(人びと)):
dictlist[k%クラス数]['氏名'].append(人びと[k])
dictlist
参考
https://stackoverflow.com/questions/2397754/how-can-i-create-an-array-list-of-dictionaries-in-python
pythonのモジュールpandasの中にあるDataFrameはエクセルなどの表の処理に便利ですが、各々のカラムの長さ(要素の数)が同じでないといけないという制約があるようです。そのため、要素の数などに制限がないようにと、辞書(dictionary)の配列を作ることを考えましたが、やり方がわからずネットで検索した結果、やり方が紹介されているのを見つけました。
dictlist = [dict() for x in range(10)]
と簡単に10個の辞書からなる配列が作れました。
Python pandas DataFrameを使っていて、セルを指定する方法がわからずネットで拾ったサンプルコードを使おうとすると、AttributeError: ‘DataFrame’オブジェクトには属性 ‘ix’がありませんというエラーを食らいました。
ixを使ったサンプルコードを頻繁に見かけるのですが、どうやらこれは廃止されたようです。 pandasのバージョンを気にする必要がありそう。ixとかlocとかilocとかで頭が混乱していたのですが、わかりやすい説明がありました。
DataFrameの行・列を指定する方法として、
行ラベル、列ラベルを使った指定方法⇒ loc
行の番号や列の番号を使った指定方法⇒iloc
ラベルや番号を使った指定方法⇒ix
ということだそうです。そして、pandas バージョン0.20.1 では、.ixインデクサが deprecatedになったそう。