辞書型で列名と値を同時に定義する
Visual Studio Code(VSC)を起動したら以下のコードを入力して実行します。
行2-4ではpandas, datetime, numpyのライブラリを取り込んでいます。
行7-12ではdict型(辞書型)の変数にPandasのDataFrameの列名と列の値(list型)を同時に定義しています。
つまり、dict型のkeyが列名でvalue(値)がlist型になっています。
行8では列名「category_name」と列の値を5レコード分str型で定義しています。
行9では列名「page_view」と列の値をint型で定義しています。
行10では列名「exclude_me」と列の値をbool型で定義しています。
行11では列名「date_added」と列の値をstr型で定義しています。
行14ではPandasのDataFrameに変数dataに格納されているデータを取り込んでいます。
行15では列名「date_added」のデータ型をstr型からdatetime型に変換しています。
行16ではDataFrameのinfo()メソッドを実行してDataFrameの各種情報を取得しています。
info()メソッドではDataFrameのレコード件数(5)、列数(4)、列名、列のデータ型などが取得できます。詳細は図1の実行結果をご覧ください。
行18ではDataFrameのすべてのデータを表示しています。
# Import the necessary libraries
import pandas as pd
import datetime as dt
import numpy as np
# Create DataFrame from dict
data = {
'category_name': ['JavaScript','jQuery','Python','C++','C#'],
'page_view': [100,150,900,600,700],
'exclude_me': [False, True, False, False, False],
'date_added': ['2021-01-05 11:29:59','2021-02-25 12:13:15','2021-05-25 05:06:59','2020-11-09 03:05:02','2019-12-05 01:02:03']
}
#print(type(data))
df = pd.DataFrame(data)
df['date_added'] = pd.to_datetime(df['date_added'], format='%Y-%m-%d %H:%M:%S') # Convert string to datetime format
print(df.info())
print('~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~')
print(df)
図1が実行結果です。print(df.info())とprint(df)で表示した内容が出力されています。
TIP1:Pythonのデータ型のCheet Sheetです。リスト型、辞書型などをどのように記述するかがわかります。
TIP2:Pandasのto_datetime()の引数「errors='ignore'」の使い方
ここでは行5の列「date_added」の値を意図的に不正な値「2021-01-05X 11:29:59」にしています。
Pandasのto_datetime()メソッドでstr型の日時をdatetime型に変換するとき、日時の形式が不正だとPandasはエラーとなり処理を中断します。
このとき不正な日時を検出してもエラーを無視して処理を続行させたいときは引数「errors='ignore'」を指定します。
ただし、列「date_added」のデータ型は「object型(str型)」になります。
一旦、不正なデータも含めてDataFrameに取り込んだらprint(df)でDataFrameの内容を表示して該当するデータを修正します。
data = {
'category_name': ['JavaScript','jQuery','Python','C++','C#'],
'page_view': [100,150,900,600,700],
'exclude_me': [False, True, False, False, False],
'date_added': ['2021-01-05X 11:29:59','2021-02-25 12:13:15','2021-05-25 05:06:59','2020-11-09 03:05:02','2019-12-05 01:02:03']
}
df = pd.DataFrame(data)
print(f'df.date_added.dtypes (before) = {df.date_added.dtypes}')
df['date_added'] = pd.to_datetime(df['date_added'], format='%Y-%m-%d %H:%M:%S', errors='ignore') # Convert string to datetime format => Ignore
print(f'df.date_added.dtypes (after) = {df.date_added.dtypes}')
print()
print(df)
TIP2の実行結果です。列category_nameが「JavaScrip」の列「date_added」の値が不正な日時になっていますが無視されてDataFrameに格納されています。
この場合、print(df.date_added.dtypes)で確認するとデータ型が「object」になっているのがわかります。
あとは、print(df)でDataFrameの内容を表示し、目視で不正なデータを探して修正します。
TIP3:Pandasのto_datetime()の引数「errors='coerce'」の使い方
ここでは行5の列「date_added」の値を意図的に不正な値「2021-01-05X 11:29:59」にしています。
Pandasのto_datetime()メソッドの引数に「errors='coerce'」を指定したときは、「errors='ignore'」と同様エラーを無視して処理を続行します。
ただし、「errors='coerce'」のときは不正なデータは「NaT(Not a Timeの意味)」として格納します。
そして、列「date_added」のデータ型は「datetime64」になります。
print(df)でDataFrameを表示すると不正な日時は「NaT」が表示されるので、該当するデータを修正します。
「errors='coerce'」は、データ型を優先してデータ型に値を合わせます。
なのでデータ型と異なるデータを検出したときは「NaT」と置換します。
この場合、列「data_added」のデータ型「datetime64」になることが保証されます。
一方、「errors='ignore'」は、取り込むデータの型を優先します。
なので不正な日時を検出したときはデータに合わせて列「date_added」のデータ型を「object」とします。
data = {
'category_name': ['JavaScript','jQuery','Python','C++','C#'],
'page_view': [100,150,900,600,700],
'exclude_me': [False, True, False, False, False],
'date_added': ['2021-01-05X 11:29:59','2021-02-25 12:13:15','2021-05-25 05:06:59','2020-11-09 03:05:02','2019-12-05 01:02:03']
}
df = pd.DataFrame(data)
print(f'df.date_added.dtypes (before) = {df.date_added.dtypes}')
df['date_added'] = pd.to_datetime(df['date_added'], format='%Y-%m-%d %H:%M:%S', errors='coerce') # Convert string to datetime format => NaT
print(f'df.date_added.dtypes (after) = {df.date_added.dtypes}')
print()
print(df) # or print(df[df.date_added.isnull()])
# Tip:
# NaN is a NumPy value. np.NaN
# NaT is a Pandas value. pd.NaT
# None is a vanilla Python value. None
TIP3の実行結果です。category_nameが「JavaScript」のdate_addedの値が「NaT」と表示されています。
「NaT」とは「Not a Time」の意味ですから値が「日時」の形式でないということがわかります。
データの件数が少ないときは「errors='ignore'」でもよいのですが、不正なデータを探すことを考える「errors='coerce'」を指定することを推奨します。
DataFrameの列「date_added」の値が不正なレコード(行)のみ絞り込みしたいときは「isnull()」を使用します。
ここでは「print(df[df.date_added.isnull()])」で「NaT」のデータのみ絞り込んで表示させています。
Pythonのappend()関数で列の値をリスト型変数に追加する
行2ではDataFrameのインデックスをlist型で定義しています。
DataFrameのインデックスはデフォルトでint型になりますが、この例のようにstr型も指定できます。
行3では列名をlist型で定義しています。
行4ではlist型の空の変数を定義しています。
行5-9ではPythonのappend()関数でリストに格納されている値を変数dataに追加しています。
つまり、行5を実行するとdata変数の内容は「data = [['JavaScript', 100, False, '2021-01-05 11:29:59']]」のようになります。
行12ではPandasのDataFrame()メソッドでデータを取り込んでいます。
DataFrame()メソッドの引数1にはデータの値が格納されているlist型の変数「data」を指定します。
引数columnsには列名が格納されているlist型の変数「columns」を指定します。
引数indexにはインデックスが格納されているlist型の変数「indices」を指定します。
行11のように引数indexを省略するとデフォルトのint型のインデックスになります。
行13のように記述すると列名「date_added」を除外することができます。
行14では列名「date_added」をstr型からdatetime型に変換しています。
行15ではDataFrameの内容を表示しています。
# Add Rows One By One To Data
indices = ['a','b','c','d','e']
columns = ['category_name', 'page_view', 'exclude_me', 'date_added']
data = []
data.append(['JavaScript', 100, False, '2021-01-05 11:29:59'])
data.append(['jQuery', 150, True, '2021-02-25 12:13:15'])
data.append(['Python', 900, False, '2021-05-25 05:06:59'])
data.append(['C++', 600, False, '2020-11-09 03:05:02'])
data.append(['C#', 700, False, '2019-12-05 01:02:03'])
#df =pd.DataFrame(data, columns=columns)
df =pd.DataFrame(data, columns=columns, index=indices)
#df = pd.DataFrame.from_records(data, exclude=['date_added'], columns=columns, index=indices)
df['date_added'] = pd.to_datetime(df['date_added'], format='%Y-%m-%d %H:%M:%S') # Convert string to datetime format
print(df)
図2が実行結果です。print(df)で表示した内容が出力されています。
インデックスがint型ではなくstr型になっています。
Pythonのzip()関数で値を定義した複数の変数を一つにまとめる
行1ではDataFrameの「index」の値を定義しています。
行2ではDataFrameの列名を定義しています。
行3-6ではそれぞれの列の値を定義しています。
行7ではPythonのzip()関数を使用して行3-6で定義した列の値をzipped_listにまとめています。
行8ではPandasのDataFrame()でデータを生成しています。
行9では「date_added」列をstr型からdatetime型に変換しています。
行10ではDataFrameのデータを表示しています。
行12-16ではDataFrameのshapeプロパティを使用して行数、列数を取得して表示しています。
indices = ['a','b','c','d','e']
columns = ['category_name', 'page_view', 'exclude_me', 'date_added']
list_of_category = ['JavaScript','jQuery','Python','C++','C#']
list_of_pageview = [100,150,900,600,700]
list_of_excludeme = [False,True,False,False,False]
list_of_dateadded = ['2021-01-05 11:29:59','2021-02-25 12:13:15','2021-05-25 05:06:59','2020-11-09 03:05:02','2019-12-05 01:02:03']
zipped_list = list(zip(list_of_category, list_of_pageview, list_of_excludeme, list_of_dateadded))
df = pd.DataFrame(zipped_list, columns=columns, index=indices)
df['date_added'] = pd.to_datetime(df['date_added'], format='%Y-%m-%d %H:%M:%S') # Convert string to datetime format
print(df)
#print(df.info()) # Display number of rows, columns, etc.
print(f'df.shape = {df.shape}') # Get the number of rows and columns
print(f'rows = {df.shape[0]}') # Get the number of rows
print(f'cols = {df.shape[1]}') # Get the number of columns
rows, cols = df.shape
print(f'rows = {rows}, cols = {cols}')
図3は実行結果です。print()で表示したDataFrameの行数、列数が出力されています。