83076


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

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

①Excelデータ

No | 国 | 都市  
---|---|---  
1 | アメリカ | カリフォルニア  
2 | カナダ | -  
3 | 日本 | -  
４ | 韓国 | ソウル  
  
②実現Excelデータ（フィルター状態）

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

[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)
    
    
[/code]

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


CC BY-SA 4.0
2021-10-13T08:40:19.073
83069
2021-10-13T12:46:33.157
2021-10-13T08:56:15.310
3060
18859
question
python3
pythonで空白を抜きでフィルターをしたい


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

[pandas.DataFrame.dropna](https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.dropna.html)  
[Working with missing data](https://pandas.pydata.org/pandas-
docs/stable/user_guide/missing_data.html)  
[pandas – isna、notna で欠損値かどうかを判定する方法](https://pystyle.info/pandas-check-
missing-values/)  
[[pandas]DataFrameのNaNをサクッとNoneに置き換える方法2つ](http://pixelbeat.jp/replace-nan-
with-none-in-pandas-dataframe/)

なので、この行を：

[code]

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

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

[code]

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

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

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

[code]

    df1 = df.replace('-', pd.NaT)
    
[/code]

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

[code]

    import numpy as np
    df1 = df.replace('-', np.nan)
    
[/code]

* * *

あるいは空白削除の処理を`dropna`ではなくこちらで行うということも考えられます。  
[［pandas］特定の条件を満たす行を削除する](https://linus-
mk.hatenablog.com/entry/2019/01/10/003349)

この行を：

[code]

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

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

[code]

    df2 =df1[df1["都市"] != '']
    
[/code]


CC BY-SA 4.0
2021-10-13T12:46:33.157
83076
2021-10-13T12:46:33.157
26370
83069
answer