pandasで不要なレコード抽出して削除する

2020年12月21日

pandasで不要なレコード抽出して削除する

今回も競馬のデータを使って不要なレコードの削除を行ってみたいと思います。
データ分析において実際に不要か否かは不明なところですがデータを開けてみると「着順」の所に「中止」や「除外」といった文字列が入っています。


# rank: ['1' '2' '3' '4' '5' '6' '7' '8' '9' '10' '11' '12' '13' '14' '中止' '15'
#  '16' '除外' '取消' '17' '18']

実際のページを確認してみますがしっかり「中止」とありますね。

今回はこのレコードを削除してみます。

コード


df = pd.DataFrame(datas)


# 全レコード数を確認
print(len(df))
# 20242


# 全データのユニークな値を確認
column_names = df.columns
for column_name in column_names:
    unique_datas = pd.unique(df[column_name])
    print(f'{column_name}: {unique_datas}')
# race_number: ['2' '3' '4' '5' '6' '7' '8' '9' '10' '11' '12' '1']
# rank: ['1' '2' '3' '4' '5' '6' '7' '8' '9' '10' '11' '12' '13' '14' '中止' '15'
#  '16' '除外' '取消' '17' '18']
# horse_number: ['4' '14' '13' '6' '3' '12' '9' '8' '1' '5' '10' '2' '11' '7' '15' '16'
#  '17' '18']
# horse_name: ['バトルピアサー' 'バーミーズ' 'ノーブルローズ' ... 'グーテンターク' 'ケヴィン' 'レッドフラヴィア']
# horse_sex: ['牝' '牡' 'セ' '']
# horse_age: ['3' '2' '6' '4' '5' '7' '8' '9' '']
# jockey_weight: ['54.0' '52.0' '51.0' '53.0' '56.0' '55.0' '57.0' '50.0' '49.0' '58.0'
#  '48.0' '57.5' '60.0' '59.0' '62.0' '61.0' '56.5' '63.0' '64.0']
# jockey_name: ['川島' '丹内' '大野' '荻野琢' '横山和' '藤岡康' '△亀田' '▲山田' '▲秋山稔' '加藤' '岩田康' '石川' '柴山'
#  '☆団野' '藤岡佑' 'ルメー' '古川' '武豊' '横山武' '浜中' '池添' '国分恭' '水口' '吉田隼' '黛' '菱田'
#  '松田' '勝浦' '団野' '荻野極' '村田' '田中勝' '山田' '亀田' '◇藤田菜' '蛯名' '横山典' '柴田善' '田辺'
#  '藤田菜' '和田竜' '西村淳' '福永' '内田博' '坂井' '酒井' '藤井勘' '大庭' '竹之下' '石川倭' '北村宏' '秋山稔'
#  '落合玄' '阿部龍' '桑村真' '☆木幡育' '服部茂' 'Mデム' '木幡育' '的場' '杉原' '戸崎圭' '▲原' '江田照'
#  '▲亀田' '丸山' '嶋田' '城戸' '畑端' '国分優' '△木幡育' '野中' '和田' '☆斎藤' '丸田' '柴田大' '鮫島駿'
#  '☆西村淳' '▲小林凌' '☆菊沢' '宮崎' '伊藤' '武士沢' '△菅原明' '三津谷' '△団野' '井上' '石神' '熊沢'
#  '平沢' '小野寺' '植野' '西谷' '伴' '草野' '高田' '佐久間' '森一' '大江原' '黒岩' '五十嵐' '金子' '白浜'
#  '小坂' '山本' '蓑島' '北沢' '☆森裕' '▲服部' '西田' '木幡初' '中谷' '菅原明' '菊沢' '斎藤' '田中健'
#  '長岡' '高倉' '上野' '高野' '秋山真' '☆川又' '原' '鮫島良' '江田勇' '藤懸' '中村' '田村' '川又' '原田和'
#  '難波' '柴田未' '木幡巧' '武藤' 'レーン' '吉田豊' '三浦' '津村' '菅原隆' '石橋脩' '岩部' '嘉藤' '▲小林脩'
#  '中井' '津村明' '坂井瑠' '石川裕' '北村友' '鈴木' '真島大' '☆岩田望' '松若' '太宰' '岩田望' '西村太' '岩崎'
#  '小林凌' '伴啓太' '白浜雄' '松山' '川須' '幸' '川田' '▲泉谷' '☆富田' '岡田' '小牧' '泉谷' '小崎'
#  '和田翼' '酒井学' '富田' '小林脩' '▲山田敬' '嘉藤貴' '森裕' '三浦皇' '丸山元' 'ミナリ' '☆野中' 'マーフ'
#  '松岡' '佐藤友' 'C.ル' 'M.デ' 'F.ミ' '☆野中悠' 'フォー' '繁田健' '▲三津谷' '秋山' '御神本' 'ヒュー'
#  '柴山雄' '山本咲' '田辺裕' '▲藤田菜' '▲大塚' 'S.フ' 'O.マ' '勝浦正' '丹内祐' 'シュタ' '本橋孝' '森泰斗'
#  '笹川翼' '鴨宮祥' '▲原優介' '△岩田望' '岡田祥' '岡部誠' '△斎藤' '四位']
# race_time: ['1:46.2' '1:46.9' '1:47.0' ... '3:41.3' '3:41.8' '3:42.9']
# popularity: ['1' '3' '8' '2' '6' '5' '12' '11' '9' '10' '7' '14' '4' '13' '15' '16' ''
#  '17' '18']
# odds: ['2.7' '6.3' '19.1' ... '454.6' '115.6' '150.3']
# passage: ['1-1-1-1' '3-2-2-2' '14-14-11-5' ... '5-6-4-7' '6-7-3-3' '6-6-3-5']
# trainer: ['荒川' '飯田雄' '高柳瑞' '野中' '千田' '高橋康' '南井' '村山' '岩戸' '藤沢則' '国枝' '水野' '根本' '矢野'
#  '中内田' '鹿戸' '池江' '鮫島' '松永幹' '宮' '堀' '大竹' '牧' '大和田' '牧田' '久保田' '羽月' '中舘'
#  '岡田' '尾関' '矢作' '戸田' '宗像' '橋田' '小桧山' '田島' '浅見' '田中剛' '須貝' '粕谷' '菊沢' '林'
#  '石坂公' '高橋祥' '平田' '上原' '小西' '稲垣' '木原' '吉岡' '本田' '石栗' '安田隆' '松山' '鈴木伸' '寺島'
#  '田中清' '森' '飯田祐' '天間' '杉山晴' '武幸' '中尾' '坂口' '伊藤伸' '和田郎' '音無' '清水英' '高橋忠'
#  '畠山' '相沢' '新谷' '鈴木孝' '栗田' '谷' '堀井' '青木' '本間' '高橋裕' '高野' '加藤和' '清水久' '藤原英'
#  '藤沢和' '田村' '西村' '昆' '田中博' '加藤征' '南田' '角田' '吉村' '古賀慎' '金成' '黒岩' '小笠' '和田雄'
#  '柄崎' '西園' '武英' '新開' '竹内' '浜田' '勢司' '高橋亮' '牧浦' '萩原' '田所' '深山' '森田' '小崎'
#  '佐々木' '池添学' '梅田' '北出' '湯窪' '大江原' '木村' '友道' '奥村豊' '藤原辰' '中野' '加藤士' '奥村武'
#  '吉田' '伊藤圭' '米川昇' '武井' '大橋' '的場' '武藤' '高柳大' '萱野' '伊藤大' '斎藤誠' '宮田' '菊川'
#  '安田翔' '西橋' '五十嵐' '松下' '浅野' '今野' '宮本' '上村' '蛯名' '池添兼' '西浦' '大根田' '小野' '高木'
#  '藤岡' '松永昌' '庄野' '和田勇' '中竹' '尾形' '松永康' '橋口' '笹田' '池上' '中川' '佐藤' '大久保' '小島'
#  '小手川' '松田' '手塚' '加用' '土田' '古賀史' '渡辺' '武市' '石毛' '杉浦' '斉藤正' '田中正' '星野'
#  '高橋博' '長谷川' '田中淳' '角川秀' '林和弘' '桧森邦' '高橋文' '村上正' '菅原勲' '安達' '石橋' '小野望'
#  '角居' '奥平' '河内' '斉藤崇' '川村' '石坂正' '荒山勝' '服部' '伊坂' '高市' '山内' '井上孝' '杉山'
#  '河津裕' '福永敏' '矢野義' '松本隆' '作田' '米谷康' '山中尊' '須田和' '長南和' '角田輝']
# horse_weight: ['406' '456' '446' '434' '462' '438' '450' '444' '430' '476' '448' '474'
#  '464' '402' '422' '426' '492' '488' '508' '468' '458' '500' '526' '470'
#  '478' '496' '432' '460' '480' '414' '454' '504' '392' '482' '484' '418'
#  '528' '466' '442' '532' '452' '502' '420' '424' '486' '494' '410' '362'
#  '490' '518' '436' '512' '440' '428' '510' '498' '564' '506' '416' '522'
#  '398' '408' '472' '514' '404' '530' '524' '558' '' '400' '552' '548'
#  '516' '542' '412' '588' '520' '366' '546' '584' '538' '534' '570' '536'
#  '544' '370' '396' '568' '550' '394' '540' '388' '390' '554' '556' '572'
#  '999' '386' '384' '380' '560' '376' '360' '580' '566' '562' '374' '378'
#  '368' '578' '364' '382' '576' '586' '582' '354' '356' '590' '358' '342']
# horse_weight_changes: ['-2' '0' '-6' '-4' '+4' '+6' '-8' '-12' '-10' '+10' '+2' '+12' '+8' '+15'
#  '+22' '-16' '+16' '-14' '-18' '+14' '-20' '+20' '-26' '+28' '+18' '-9' ''
#  '-5' '+30' '+11' '+7' '-3' '+24' '-7' '+1' '-1' '+26' '-22' '-28' '+9'
#  '-11' '+5' '+17' '-29' '+34' '-23' '-19' '-13' '-17' '+32' '+3' '-24'
#  '+19' '+23' '+36' '+42' '-34' '-32' '+13' '-15' '+38' '+31' '-25' '+25']


# rankが中止のレコードを確認
print(df[df['rank']=='中止'])
#       race_number rank   ...
# 62              6   中止 ...
# 175             4   中止 ...
# 684             1   中止 ...
# 748             6   中止 ...
# 944            11   中止 ...
# ...           ...  ...   ...
# 19432          12   中止 ...
# 19460           2   中止 ...
# 19476           3   中止 ...
# 19831           4   中止 ...
# 20053           8   中止 ...


# rankが中止のレコード数を確認
len(df[df['rank']=='中止'])
# 106


# rankが中止のレコードを削除
deleted_cancelled_df = df[df['rank']!='中止']


# 削除後のデータフレームのレコード数を確認
len(deleted_cancelled_df)
# 20136


# rankが中止、除外、取消のレコードを確認
print(df[(df['rank']=='中止') | (df['rank']=='除外') | (df['rank']=='取消')])
#       race_number rank   ...
# 62              6   中止 ...
# 149             2   除外 ...
# 175             4   中止 ...
# 242            11   除外 ...
# 430             3   取消 ...
# ...           ...  ...   ...
# 19476           3   中止 ...
# 19831           4   中止 ...
# 20053           8   中止 ...
# 20157           4   取消 ...
# 20221           8   取消 ...


print(len(df[(df['rank']=='中止') | (df['rank']=='除外') | (df['rank']=='取消')]))
# 172


# rankが中止、除外、取消のレコード数を確認
len(df[(df['rank']!='中止') & (df['rank']!='除外') & (df['rank']!='取消')])
# 20070


# rankが中止、除外、取消のレコードを削除
deleted_strings_in_rank_df = df[(df['rank']!='中止') & (df['rank']!='除外') & (df['rank']!='取消')]
print(deleted_strings_in_rank_df)
#   race_number rank     ...
# 0               2    1 ...
# 1               2    2 ...
# 2               2    3 ...
# 3               2    4 ...
# 4               2    5 ...
# ...           ...  ... ...
# 20237          12    9 ...
# 20238          12   10 ...
# 20239          12   11 ...
# 20240          12   12 ...
# 20241          12   13 ...
# [20070 rows x 15 columns]
YouTube

2020年12月21日