解決したいこと
※プログラム初心者ですので分からないところが多く,抜けている部分があると思いますのでご了承ください.
データフレームでの検索が一部うまくいきません.
すでに解決済みです.
環境
macOS version13.5
VSCode
python 3.10.9
やりたいこと
「塾で生徒が登校した際,読み取るIDから生徒情報を抽出し,座席を指定する」プログラムを作ろうとしています.
大枠
- 143席を偶数奇数に分別.
- エクセルに保存されている{ID, 氏名, 学年, 状態, 座席}をデータフレームとして読み込む.
--入力待ちの状態で待機--
3. キーボード(本番はバーコード)から生徒番号を取得.
4. 偶数席から指定して行き,偶数席がなくなれば奇数席を指定.
5. 生徒名と番号を画面に表示させて登校者に伝える&渡した座席は一時的に使用できないようにする.
6. データフレームにおける該当生徒の'座席'列に座席番号を追加
以降付け加えようと思う機能
・すでに座席を持っている生徒番号の入力があった場合,その座席を使用可能状態に戻し,データフレーム>'座席'列の値を削除する
・生徒番号と座席の手入力機能
・座席の変更機能
等
まずは全体のプログラム(途中まで)
#'*'の削除のため
import re
#座席をランダムに出力するため
import random
#エクセル読み取り
import pandas as pd
#座席
seat = set(range(1, 144))
#偶数,奇数に分別
seat_even = []
seat_odd = []
for i in seat:
if i % 2 == 0:
seat_even.append(i) #偶数
else:
seat_odd.append(i) #奇数
#エクセルから生徒情報を読み込み
df = pd.read_excel('st_info.xlsx',sheet_name='st_g',header=0, index_col=None)
df['num'].astype('int')
#生徒番号入力
st_num = str(input('生徒番号:'))
#アスタリスクを削除
st_num = st_num.strip('*')
#偶数席が残っていればその座席を渡す
#そうでなければ奇数席を渡す
seat_even_taken = []
seat_odd_taken = []
seat_num = 0
if seat_even:
seat_act=random.choice(seat_even)
print(st_num)
print(seat_act)
seat_even_taken.append(seat_act) #渡した座席
seat_even = set(seat_even) - set(seat_even_taken) #渡した座席を要素から削除
seat_num = seat_act
else:
seat_act=random.choice(seat_odd)
print(st_num)
print(seat_act)
seat_odd_taken.append(seat_act) #渡した座席
seat_odd = set(seat_odd) - set(seat_odd_taken) #渡した座席を要素から削除
seat_num = seat_act
print(df)
print(st_num)
#ここの検索機能がうまく働かない
print(df[df['num'] == st_num])
発生している問題・エラー
うまくいく例
num name grade state seat
0 43546534 東京 広大 高2 通期生
1 47387344 福岡 美味 高3 通期生
2 4768203 北 海道 高3 通期生
上記はエクセルから読み込んだデータフレームです.'num'列に生徒番号を格納しており,基本8文字であるのに対して一人,7文字のIDである生徒がいます.
8文字の生徒に対して上記のプログラムを実行すると
生徒番号:43546534
43546534
98
[199 rows x 5 columns]
43546534
num name grade state seat
0 43546534 東京 広大 高2 通期生 NaN
このようにIDが一致する生徒の情報を抽出し98番の座席を渡すことができます.
うまくいかない例
num name grade state seat
0 43546534 東京 広大 高2 通期生
1 47387344 福岡 美味 高3 通期生
2 4768203 北 海道 高3 通期生
2行目のIDが7文字の生徒番号を与えてみます.
[199 rows x 5 columns]
4768203
Empty DataFrame
Columns: [num, name, grade, state, seat]
Index: []
この様に見つからないという出力になります.
自分で試したこと
・numをstr形式で試す
→うまくいっていた部分も見つからない判定となる
・正規表現を使う
→生徒番号が変数であるため煩雑
・query関数を使う
解決方法
読み込んだExcelファイルの数値を確認すると文字列が7桁のものは最後の8桁目に空白が入っていました.
空白を消すと,
[199 rows x 5 columns]
8326673
num name grade state seat
2 4768203 北 海道 高3 通期生 NaN