0
1

More than 1 year has passed since last update.

エクセルからpandasを使ってデータフレームに読み込む

Posted at

解決したいこと

※プログラム初心者ですので分からないところが多く,抜けている部分があると思いますのでご了承ください.

データフレームでの検索が一部うまくいきません.
すでに解決済みです.

環境

macOS version13.5
VSCode
python 3.10.9

やりたいこと

「塾で生徒が登校した際,読み取るIDから生徒情報を抽出し,座席を指定する」プログラムを作ろうとしています.

大枠

  1. 143席を偶数奇数に分別.
  2. エクセルに保存されている{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
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1