行・列で構成される二次元の表形式データを扱うのに便利なpandasのDataFrameについて自分のメモも兼ねて基本操作をまとめておく。
この記事では下記のような様々なイベントの売上データなどのCSVからDataFrameオブジェクトを作ることを想定し、後のコードの中に出てくるdf
はこのDataFrameオブジェクトとしている。
DataFrameオブジェクトの生成・出力
DataFrameの構成要素
index
:行ラベル
データの各行を識別するラベルで、通し番号(整数)や文字列を使用できる。
columns
:列ラベル
データの各列を識別するラベルで、主に列名の文字列が入る。
values
:セルの値
データの各行列に対応するセルの値。
DataFrameの生成
DataFrameオブジェクトの生成は、辞書から生成する方法、CSVファイルを読み込んで生成する方法がある。
辞書から生成
カラム名: 値のリスト
の形式の辞書オブジェクトをDataFrame()
に指定して生成する。
日時の列がある場合は、必要に応じて生成後のDataFrameオブジェクトに対してto_datetime()
を利用し変換する。
変換対象の日時のフォーマットはYYYYMMDD
、YYYY-MM-DD
、YYYY/MM/DD
などの一般的な形式であれば省略できるが、それ以外のフォーマットの場合は引数format
に個別に指定する必要がある。
import pandas as pd
data = {
'イベント名': [
'アートフェスティバル2024', 'クラシック音楽祭', '映画特集上映', '現代アート展', 'ジャズフェスティバル',
'サイエンスフェア', '印象派画家展'
],
'分類': ['アート', '音楽', '映画', 'アート', '音楽', 'サイエンス', 'アート'],
'入場料': [2000, 2500, 1800, 2200, 2600, 2000, 1800],
'売上数': [5223, 4708, 5034, 4098, 4228, 9207, 8862],
'開始日': ['2024-03-15', '2024-05-01', '2024-06-20', '2024-08-15', '2024-07-01', '2024-12-05', '2024-02-10'],
'終了日': ['2024-03-25', '2024-05-05', '2024-06-25', '2024-08-20', '2024-07-05', '2024-12-10', '2024-02-17']
}
df = pd.DataFrame(data)
df['開始日'] = pd.to_datetime(df['開始日'], format='%Y-%m-%d')
df['終了日'] = pd.to_datetime(df['終了日'], format='%Y-%m-%d')
print(df)
CSVファイルから読み込み
pandasのread_csv()
でCSVファイルを直接読み込む。
日付の文字列を変換したいカラムがある場合は引数のparse_dates
に変換対象のカラム名のリストを指定する。
import pandas as pd
file_path = 'event_sales.csv' # CSVファイルのパス
df = pd.read_csv(file_path, parse_dates=['開始日', '終了日'])
print(df)
イベント名 分類 入場料 売上数 開始日 終了日
0 アートフェスティバル2024 アート 2000 5223 2024-03-15 2024-03-25
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
DataFrameの出力
DataFrameオブジェクトをCSVファイルへ出力する。
行ラベルや列ラベル(ヘッダー)の有無、データの区切り文字、書き込みモードの指定などが可能。
なお、書き込みモードが既存ファイルに上書き(mode: 'a'
)の場合、元のファイルの末尾に改行が入っていないと、元の最終行と追加の1行目が同じ行に入ってしまう。
df.to_csv('event_sales_out_1.csv') # 出力パス以外は全てデフォルト値
df.to_csv('event_sales_out_2.csv', index=False, header=False) # indexラベルとヘッダーを出力しない
df.to_csv('event_sales_out_3.csv', sep='\t') # 区切り文字を指定する(デフォルトはカンマ",")
# 既存ファイルalready_exist.csvに上書きする(デフォルトは'w':既存ファイルを切り捨ててから出力)
# 既存ファイルの末尾に改行が入っていないと元の最終行と追加データの1行目が改行されないので、既存ファイルの末尾に改行コードを追加しておく
# already_exist.csvにはevent_sales.csvと同じ内容が入っている
with open('already_exist.csv', 'a', encoding='utf-8') as f:
f.write('\n')
df.to_csv('already_exist.csv', mode='a', index=False, header=False, encoding='utf-8')
event_sales_out_1.csv
(特にオプションの引数の指定はなく全てデフォルト)
,イベント名,分類,入場料,売上数,開始日,終了日
0,アートフェスティバル,アート,2000,5223,2024-03-15,2024-03-25
1,クラシック音楽祭,音楽,2500,4708,2024-05-01,2024-05-05
2,映画特集上映,映画,1800,5034,2024-06-20,2024-06-25
3,現代アート展,アート,2200,4098,2024-08-15,2024-08-20
4,ジャズフェスティバル,音楽,2600,4228,2024-07-01,2024-07-05
5,サイエンスフェア,サイエンス,2000,9207,2024-12-05,2024-12-10
6,印象派画家展,アート,1800,8862,2024-02-10,2024-02-17
event_sales_out_2.csv
(行ラベル、列ラベルを出力しない)
アートフェスティバル,アート,2000,5223,2024-03-15,2024-03-25
クラシック音楽祭,音楽,2500,4708,2024-05-01,2024-05-05
映画特集上映,映画,1800,5034,2024-06-20,2024-06-25
現代アート展,アート,2200,4098,2024-08-15,2024-08-20
ジャズフェスティバル,音楽,2600,4228,2024-07-01,2024-07-05
サイエンスフェア,サイエンス,2000,9207,2024-12-05,2024-12-10
印象派画家展,アート,1800,8862,2024-02-10,2024-02-17
event_sales_out_3.csv
(区切り文字をタブ\t
に変更)
イベント名 分類 入場料 売上数 開始日 終了日
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
already_exist.csv
(既存のCSVファイルに追記)
イベント名,分類,入場料,売上数,開始日,終了日
アートフェスティバル,アート,2000,5223,2024-03-15,2024-03-25
クラシック音楽祭,音楽,2500,4708,2024-05-01,2024-05-05
映画特集上映,映画,1800,5034,2024-06-20,2024-06-25
現代アート展,アート,2200,4098,2024-08-15,2024-08-20
ジャズフェスティバル,音楽,2600,4228,2024-07-01,2024-07-05
サイエンスフェア,サイエンス,2000,9207,2024-12-05,2024-12-10
印象派画家展,アート,1800,8862,2024-02-10,2024-02-17
アートフェスティバル,アート,2000,5223,2024-03-15,2024-03-25
クラシック音楽祭,音楽,2500,4708,2024-05-01,2024-05-05
映画特集上映,映画,1800,5034,2024-06-20,2024-06-25
現代アート展,アート,2200,4098,2024-08-15,2024-08-20
ジャズフェスティバル,音楽,2600,4228,2024-07-01,2024-07-05
サイエンスフェア,サイエンス,2000,9207,2024-12-05,2024-12-10
印象派画家展,アート,1800,8862,2024-02-10,2024-02-17
行・列の操作
データの並べ替え
sort_values()
でデータを行方向に並べ替える。
by
で並べ替えの基準となる列ラベルを指定し、ascending
がTrueなら昇順、Falseなら降順になる。(デフォルトは昇順)
data = df.sort_values(by='入場料', ascending=False)
print(data)
イベント名 分類 入場料 売上数 開始日 終了日
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
複数の列ラベルを基準に並べ替えることも可能。
data = df.sort_values(by=['入場料', '売上数'])
print(data)
イベント名 分類 入場料 売上数 開始日 終了日
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
行ラベルと列ラベルの変更
DataFrameオブジェクトのcolumns
、index
を新しい値のリストで更新することができる。
# 行ラベルの変更
df.index = [10, 20, 30, 40, 50, 60, 70]
# 列ラベルの変更
df.columns = ['event_name', 'category', 'entrance_fee', 'sales', 'start_date', 'end_date']
print(df)
event_name category entrance_fee sales start_date end_date
10 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25
20 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
30 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
40 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
50 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
60 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
70 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
データの結合
concat()による結合
concat()
で複数のDataFrameオブジェクトを結合できる。
結合するDataFrameオブジェクトのリストを指定し、axis=0
(デフォルト)なら行方向に結合、axis=1
なら列方向に結合される。
特に行方向の結合の場合、ignore_index=True
を指定することで結合後の行ラベルをリセットして0始まりの通し番号にできる。
# 行方向に追加する
row = {
'イベント名': ['テクノロジー博覧会', '大英博物館展'],
'分類': ['テクノロジー', '考古学'],
'入場料': [2000, 3000],
'売上数': [6677, 9022],
'開始日': ['2024-03-21', '2024-03-31'],
'終了日': ['2024-08-01', '2024-08-08']
}
add_row = pd.DataFrame(row)
add_row['開始日'] = pd.to_datetime(add_row['開始日'], format='%Y-%m-%d')
add_row['終了日'] = pd.to_datetime(add_row['終了日'], format='%Y-%m-%d')
df_add_row = pd.concat([df, add_row], axis=0, ignore_index=True)
print(df_add_row, '\n')
# 列方向に追加する
col = {
'メモ': ['屋外展示あり', '有名指揮者が出演', '話題作を一挙公開', '若手アーティスト特集', '夜間ステージあり', '子供向けワークショップ', '名画が集結'],
}
add_col = pd.DataFrame(col)
df_add_col = pd.concat([df, add_col], axis=1)
print(df_add_col)
イベント名 分類 入場料 売上数 開始日 終了日
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
7 テクノロジー博覧会 テクノロジー 2000 6677 2024-03-21 2024-08-01
8 大英博物館展 考古学 3000 9022 2024-03-31 2024-08-08
イベント名 分類 入場料 売上数 開始日 終了日 メモ
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25 屋外展示あり
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05 有名指揮者が出演
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25 話題作を一挙公開
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20 若手アーティスト特集
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05 夜間ステージあり
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10 子供向けワークショップ
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17 名画が集結
merge()による結合
merge()
で結合する場合はon
で結合の軸を指定しhow
で結合方法を指定する。
concat()
とは異なり結合するオブジェクトは2つしか指定できないことに注意。
concat()
でもjoin
のパラメータを指定して同様の結合ができるが、SQLに馴染みがある人はmerge()
のほうが直感的で分かりやすいかもしれない。(個人の感想です、、、)
特にouter
はSQLで言うところのFULL OUTER JOIN
であるが、もちろん左外部結合left
と右外部結合right
も指定できる。
# 結合するデータ
location = {
'イベント名': ['アートフェスティバル', 'クラシック音楽祭', '映画特集上映', '現代アート展', 'テクノロジー博覧会', '大英博物館展'],
'開催地': ['大阪', '東京', '東京', '仙台', '名古屋', '東京'],
}
df_location = pd.DataFrame(location)
df_inner_join = pd.merge(df, df_location, on='イベント名', how='inner') # 内部結合
print(df_inner_join, '\n')
df_outer_join = pd.merge(df, df_location, on='イベント名', how='outer') # 外部結合
print(df_outer_join)
イベント名 分類 入場料 売上数 開始日 終了日 開催地
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25 大阪
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05 東京
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25 東京
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20 仙台
イベント名 分類 入場料 売上数 開始日 終了日 開催地
0 アートフェスティバル アート 2000.0 5223.0 2024-03-15 2024-03-25 大阪
1 クラシック音楽祭 音楽 2500.0 4708.0 2024-05-01 2024-05-05 東京
2 サイエンスフェア サイエンス 2000.0 9207.0 2024-12-05 2024-12-10 NaN
3 ジャズフェスティバル 音楽 2600.0 4228.0 2024-07-01 2024-07-05 NaN
4 テクノロジー博覧会 NaN NaN NaN NaT NaT 名古屋
5 印象派画家展 アート 1800.0 8862.0 2024-02-10 2024-02-17 NaN
6 大英博物館展 NaN NaN NaN NaT NaT 東京
7 映画特集上映 映画 1800.0 5034.0 2024-06-20 2024-06-25 東京
8 現代アート展 アート 2200.0 4098.0 2024-08-15 2024-08-20 仙台
上の外部結合の結果を見ると、整数値であるはずの入場料と売上数に.0が付いている。
これは、処理の結果整数値が入るべき列にNaN(float型とみなされる)が含まれたことが原因であり、気になる場合はNaNを0に置き換えて列全体を整数に変換することで解消できる。
# NaNを0に置き換えて整数型に変換する
df_outer_join['入場料'] = df_outer_join['入場料'].fillna(0).astype(int)
df_outer_join['売上数'] = df_outer_join['売上数'].fillna(0).astype(int)
print(df_outer_join)
イベント名 分類 入場料 売上数 開始日 終了日 開催地
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25 大阪
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05 東京
2 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10 NaN
3 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05 NaN
4 テクノロジー博覧会 NaN 0 0 NaT NaT 名古屋
5 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17 NaN
6 大英博物館展 NaN 0 0 NaT NaT 東京
7 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25 東京
8 現代アート展 アート 2200 4098 2024-08-15 2024-08-20 仙台
指定の行・列の値の参照
loc[]による参照
loc[]
は行ラベルと列ラベルを指定して値を参照する。
単一の行・列ラベル、行・列ラベルのリスト、スライス表記で指定できる。
特にスライス表記は、通常PythonでA:B
とすると「A以上B未満」になるがloc[]
ではBも含まれるので注意。
# 行の位置番号と行ラベルが共に整数値だと分かりにくいので行ラベルを任意の文字列に変更
df.index = ['row_0', 'row_1', 'row_2', 'row_3', 'row_4', 'row_5', 'row_6']
# 単一の行・列ラベル
print(df.loc['row_1', '分類'], '\n')
# 行・列ラベルのリスト
print(df.loc[['row_0', 'row_2', 'row_4'], ['イベント名', '売上数']], '\n')
# スライスオブジェクト
print(df.loc['row_0':'row_2', '入場料'])
音楽
イベント名 売上数
row_0 アートフェスティバル 5223
row_2 映画特集上映 5034
row_4 ジャズフェスティバル 4228
row_0 2000
row_1 2500
row_2 1800
Name: 入場料, dtype: int64
任意の条件に一致する行データだけを抽出することも可能。
複数の条件で絞り込みたい場合はそれぞれの条件を()
で囲って繋げて書ける。
# 分類が「アート」または「音楽」
data_or = df.loc[(df['分類'] == 'アート') | (df['分類'] == '音楽')]
print(data_or, '\n')
# 開始日が2024/6/1以降で売上数が5000以上
data_and = df.loc[(df['開始日'] >= pd.Timestamp(2024, 6, 1)) & (df['売上数'] >= 5000)]
print(data_and)
イベント名 分類 入場料 売上数 開始日 終了日
row_0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25
row_1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
row_3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
row_4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
row_6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
イベント名 分類 入場料 売上数 開始日 終了日
row_2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
row_5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
iloc[]による参照
loc[]
と異なり、参照対象のラベルではなく行と列の位置番号を指定する。
単一の行・列番号、行・列番号のリスト、スライス表記で指定できる。
loc[]
と異なりスライス表記でA:B
とするとBは含まれない。
# 単一の行・列番号
print(df.iloc[0, 1], '\n')
# 行・列番号のリスト
print(df.iloc[[1, 3, 5], [0, 2]], '\n')
# スライスオブジェクト
print(df.iloc[0:2, 2:])
アート
イベント名 入場料
1 クラシック音楽祭 2500
3 現代アート展 2200
5 サイエンスフェア 2000
入場料 売上数 開始日 終了日
0 2000 5223 2024-03-15 2024-03-25
1 2500 4708 2024-05-01 2024-05-05
行についてはlambda式を使って条件に一致するデータを抽出することも可能。
# 行が偶数番目のデータ
data = df.iloc[lambda x: x.index % 2 == 0, 2:]
print(data)
入場料 売上数 開始日 終了日
0 2000 5223 2024-03-15 2024-03-25
2 1800 5034 2024-06-20 2024-06-25
4 2600 4228 2024-07-01 2024-07-05
6 1800 8862 2024-02-10 2024-02-17
指定の行・列の削除
行の削除はdrop()
に単一の行ラベルかリストを指定する。
引数index
に行ラベルかリストを指定することも可能。
df_drop_row = df.drop(0) # 行ラベルのリストでも可能
df_drop_rows = df.drop(index=[0, 2, 4]) # 単一の行ラベルでも可能
print(df_drop_row, '\n')
print(df_drop_rows)
イベント名 分類 入場料 売上数 開始日 終了日
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
イベント名 分類 入場料 売上数 開始日 終了日
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17
列の削除はdrop()
に単一の列ラベルかリストを指定した上でaxis=1
にする。
引数columns
に列ラベルかリスト指定すればaxis
は設定しなくても対象の列を削除できる。
df_drop_col = df.drop('開始日', axis=1) # 列ラベルのリストでも可能
df_drop_cols = df.drop(columns=['イベント名', '分類']) # 単一の列ラベルでも可能
print(df_drop_col, '\n')
print(df_drop_cols)
イベント名 分類 入場料 売上数 終了日
0 アートフェスティバル アート 2000 5223 2024-03-25
1 クラシック音楽祭 音楽 2500 4708 2024-05-05
2 映画特集上映 映画 1800 5034 2024-06-25
3 現代アート展 アート 2200 4098 2024-08-20
4 ジャズフェスティバル 音楽 2600 4228 2024-07-05
5 サイエンスフェア サイエンス 2000 9207 2024-12-10
6 印象派画家展 アート 1800 8862 2024-02-17
入場料 売上数 開始日 終了日
0 2000 5223 2024-03-15 2024-03-25
1 2500 4708 2024-05-01 2024-05-05
2 1800 5034 2024-06-20 2024-06-25
3 2200 4098 2024-08-15 2024-08-20
4 2600 4228 2024-07-01 2024-07-05
5 2000 9207 2024-12-05 2024-12-10
6 1800 8862 2024-02-10 2024-02-17
行・列間の計算処理の一例
DataFrameの基本操作を組み合わせて行・列データ間の計算処理などを行う簡単な例をいくつか試してみる。
1行内における任意の列同士の計算
「入場料」「売上数」列の値を掛け合わせて売上金額を計算し、「売上金額」列を追加する。
元のDataFrameオブジェクトに追加したい列ラベルを指定して計算結果を代入するだけ。
df['売上金額'] = df['売上数'] * df['入場料']
print(df)
イベント名 分類 入場料 売上数 開始日 終了日 売上金額
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25 10446000
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05 11770000
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25 9061200
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20 9015600
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05 10992800
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10 18414000
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17 15951600
日時の列データから期間を計算
「開始日」「終了日」列の日付から開催期間の日数を求め、その日数で入場者数を割り1日あたりの平均売上数を計算し「日平均売上数」列を追加する。
行データ毎の開催期間の日数を保持しておく一時変数event_duration
はSeries
オブジェクトになる。
# 各イベント毎の開催期間の日数を計算する
event_duration = (df['終了日'] - df['開始日']).dt.days + 1
df['日平均売上数'] = (df['売上数'] / event_duration).astype(int)
print(df)
イベント名 分類 入場料 売上数 開始日 終了日 日平均売上数
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25 474
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05 941
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25 839
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20 683
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05 845
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10 1534
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17 1107
複数行の特定の列の値を使う計算
全てのイベントの売上数を合計し、それに対する各イベントの売上数の割合を計算して結果を「入場者割合」列として追加する。
# 全イベントの入場者数合計を計算
total_sales = df['売上数'].sum()
# total_salesに対する各イベントの売上数の割合を計算し、結果を「入場者割合」列として追加
df['売上数割合'] = (df['売上数'] / total_sales * 100).round(1)
print(df)
イベント名 分類 入場料 売上数 開始日 終了日 売上数割合
0 アートフェスティバル アート 2000 5223 2024-03-15 2024-03-25 12.6
1 クラシック音楽祭 音楽 2500 4708 2024-05-01 2024-05-05 11.4
2 映画特集上映 映画 1800 5034 2024-06-20 2024-06-25 12.2
3 現代アート展 アート 2200 4098 2024-08-15 2024-08-20 9.9
4 ジャズフェスティバル 音楽 2600 4228 2024-07-01 2024-07-05 10.2
5 サイエンスフェア サイエンス 2000 9207 2024-12-05 2024-12-10 22.3
6 印象派画家展 アート 1800 8862 2024-02-10 2024-02-17 21.4