0

Pandas のライブラリを使って、CSVの都市の列に”-”があれば、””空白に変換しています。
空白に変換した後に空白を抜きしてフィルターをかけたいので、dropnaで削除していますが、
なぜか上手く削除されないです。

削除できる方法もしくは、フィルターで空白を抜きで選択する方法ありますでしょうか。

①Excelデータ

No 都市
1 アメリカ カリフォルニア
2 カナダ -
3 日本 -
韓国 ソウル

②実現Excelデータ(フィルター状態)

No 都市
1 アメリカ カリフォルニア
韓国 ソウル

Code

import pandas as pd

filename_Test_csv ="TEST.csv"

filename_Test_xlsx ="TEST2.xlsx"

CSVファイルの読み込み

df = pd.read_csv(filename_Test_csv,encoding="cp932") #print(df)

#置換 df1 = df.replace('-', '')

#空白削除 df2 =df1.dropna(subset=["都市"])

#csvからExcel形式で出力 df2.to_excel(filename_Test_xlsx,index=False,encoding='utf-8') print(df2)

よろしくお願い致します。

cubick
  • 20,987
  • 5
  • 25
  • 64
幸589
  • 445
  • 1
  • 15
  • 45

1 Answers1

1

この辺の記事とその応用によると、空文字列''欠損値では無いのでdorpna()の対象では無いということですね。
pandasのisna('')Falseになります。

pandas.DataFrame.dropna
Working with missing data
pandas – isna、notna で欠損値かどうかを判定する方法
[pandas]DataFrameのNaNをサクッとNoneに置き換える方法2つ

なので、この行を:

df1 = df.replace('-', '')

以下のように変更すると-が1つだけ入っていた行が削除されます。

df1 = df.replace(['-'], [None])

ただし--のように2つ以上になったり、 -とか- 等の空白文字であっても前後に何か文字が付いていれば変換出来ません。

類似の方法で設定する値をpandasのNot a Time(pd.NaT)としたり、

df1 = df.replace('-', pd.NaT)

numpyのNot a Number(np.nan)というのも出来るでしょう。

import numpy as np
df1 = df.replace('-', np.nan)

あるいは空白削除の処理をdropnaではなくこちらで行うということも考えられます。
[pandas]特定の条件を満たす行を削除する

この行を:

df2 =df1.dropna(subset=["都市"])

こちらに変更する方法です。

df2 =df1[df1["都市"] != '']
kunif
  • 17,469
  • 3
  • 17
  • 28
  • ありがとうございます! df1 = df.replace(['-'], [None])だけ変更しましたら、上手く処理できました。 Noneだとdropnaが認識されて削除できました。またフィルターとして空白判定こちら利用します! df2 =df1[df1["都市"] != ''] すごく助かりました。 – 幸589 Oct 13 '21 at 13:50