Ccmmutty logo
Commutty IT
0 pv23 min read

pandasのDataFrameの基本操作まとめ

https://cdn.magicode.io/media/notebox/11e851ef-0c3b-4fed-89df-e6f30630e0b5.jpeg
行・列で構成される二次元の表形式データを扱うのに便利なpandasのDataFrameについて自分のメモも兼ねて基本操作をまとめておく。
この記事では下記のような様々なイベントの売上データなどのCSVからDataFrameオブジェクトを作ることを想定し、後のコードの中に出てくるdfはこのDataFrameオブジェクトとしている。

DataFrameオブジェクトの生成・出力

DataFrameの構成要素

index:行ラベル
データの各行を識別するラベルで、通し番号(整数)や文字列を使用できる。
columns:列ラベル
データの各列を識別するラベルで、主に列名の文字列が入る。
values:セルの値
データの各行列に対応するセルの値。

DataFrameの生成

DataFrameオブジェクトの生成は、辞書から生成する方法、CSVファイルを読み込んで生成する方法がある。
辞書から生成
カラム名: 値のリストの形式の辞書オブジェクトをDataFrame()に指定して生成する。
日時の列がある場合は、必要に応じて生成後のDataFrameオブジェクトに対してto_datetime()を利用し変換する。
変換対象の日時のフォーマットはYYYYMMDDYYYY-MM-DDYYYY/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オブジェクトのcolumnsindexを新しい値のリストで更新することができる。
# 行ラベルの変更
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_durationSeriesオブジェクトになる。
# 各イベント毎の開催期間の日数を計算する
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

Discussion

コメントにはログインが必要です。