ogawa_shuzo_cw
@ogawa_shuzo_cw (ogawa0706)

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

python Excelを読み込み時に「NULL」をそのまま読み込みたい

Q&A

Closed

解決したいこと

pythonでツールを作成している際に想定していない事象が発生しました。
値「NULL」をそのまま読み込む方法を教えていただけるとありがたいです。

pandasでExcelファイルを読み込み、加工・分割するツールを作成しております。
Excelの読み込み範囲内に「NULL」という値と空欄があるのですが、読み込むと両方とも空欄で出力されてしまいます。
お客さんには元ファイルのまま「NULL」と空欄を別々で出力してほしいと依頼されており
「NULL」をそのまま出力する方法がありましたら教えていただけますでしよう。

該当するデータ

    A列 B列 C列
1行目 ID  名前 メモ
2行目 001 商品A NULL
3行目 002 商品B

2行目のC列は「NULL」、3行目のC列は空欄

該当するソースコード

import pandas as pd
file_path = r'該当Excelのファイルパス'
df = pd.read_excel(file_path,header=0,dtype=object)
#加工処理や分割する処理が本来はあります
with pd.ExcelWriter('アウトプットファイルのパス') as writer:
  df.to_excel(writer, sheet_name='sheet1')

自分で試したこと

C列の「NULL」はB列が「商品A」の場合にのみ発生するそうなので、読み込み後に1行ずつチェックしてB列が「商品A」の場合はC列に「NULL」を入れる処理を追加しました。
今後「商品A」以外にもC列に「NULL」が発生するかもしれないそうで、可能なら元ファイルのまま読み込む方法を探しています。

0

4Answer

df = pd.read_excel(file_path, header=0, dtype=object, keep_default_na=False)

image.png

引数「keep_default_na」をFalseで指定してあげれば、NULLを文字列として受け取れると思います。
空白は欠損値として扱いたい場合は、別途「na_values」も指定してください。
「keep_default_na」をはじめ、その他引数についても以下のサイトに載っているのでご参考ください。

2Like

Comments

  1. @jinbei230525 さんの投稿で気づきましたが、
    欠損値判定しなくてよければ、「na_filter=False」でよさそうですね。
    勉強になりました、ありがとうございます!

  2. @ogawa_shuzo_cw

    Questioner

    ありがとうございます。解決いたしました!

下記にna_filter=Falseを追加することで、意図した動作になりませんか?

df = pd.read_excel(file_path,header=0,dtype=object)

2Like

Comments

  1. @ogawa_shuzo_cw

    Questioner

    こちらでも解決するんですね。ありがとうございます。

  2. 解決したようでしたら、質問をクローズにしましょう。

openpyxlDataFrame使うと"NULL"として読みますね。

import pandas as pd
import openpyxl
wb = openpyxl.load_workbook(filename = 'hoge.xlsx')
ws = wb[wb.sheetnames[0]]
df_ex = pd.DataFrame(ws.values)
print(df_ex)
     0    1     2
0   ID   名前    メモ
1  001  商品A  NULL
2  002  商品B  None
xls.png
1Like

Comments

  1. @ogawa_shuzo_cw

    Questioner

    試していただき、ありがとうございます。

今のエクセルはセルにNULL値を入力できるのですか?以下は入力できない前提の話です。もしかして、NULLと言う文字列が誤変換される話でしょうか?

解決済みですので蛇足になります。

na_values='Null'

を付加して,データフレームにNullとしてもそのNullは文字列では

vbaではバリアント型の未設定をNull値と言い、pandasではNaN(not a number)で後は空欄と値で表示されます。

エクセルにセルには空欄、値、計算式のエラーの #Null!のみで、vbaのようなNull値は存在しないとおもいます。

Nullをデータフレームに変換の過程で
数値列にある空欄をNullとする場合
エクセルに戻すときはNullと言う文字列ではなく、空欄ではないでしょうか?

1Like

Comments

  1. @ogawa_shuzo_cw

    Questioner

    文字列としてはNULLを入力できるようです。
    参考にさせていただきます。ありがとうございます。

Your answer might help someone💌