219

空白(任意の量)を含むPandasデータフレーム内のすべての値を検索し、それらの値をNaNに置き換えたいと思います。

これをどのように改善できるかについてのアイデアはありますか?

基本的に私はこれを回したい:

                   A    B    C
2000-01-01 -0.532681  foo    0
2000-01-02  1.490752  bar    1
2000-01-03 -1.387326  foo    2
2000-01-04  0.814772  baz     
2000-01-05 -0.222552         4
2000-01-06 -1.176781  qux     

これに:

                   A     B     C
2000-01-01 -0.532681   foo     0
2000-01-02  1.490752   bar     1
2000-01-03 -1.387326   foo     2
2000-01-04  0.814772   baz   NaN
2000-01-05 -0.222552   NaN     4
2000-01-06 -1.176781   qux   NaN

私は以下のコードでそれを行うことができましたが、人はそれが醜いです。Pythonicではなく、パンダの最も効率的な使用法でもないと確信しています。各列をループし、空白に一致する各値の正規表現検索を実行する関数を適用することによって生成された列マスクに対してブール置換を実行します。

for i in df.columns:
    df[i][df[i].apply(lambda i: True if re.search('^\s*$', str(i)) else False)]=None

空の文字列を含む可能性のあるフィールドを反復処理するだけで、少し最適化できます。

if df[i].dtype == np.dtype('object')

しかし、それはあまり改善されていません

そして最後に、このコードはターゲット文字列をNoneに設定します。これは、のようなPandasの関数で機能しますが、実際にの代わりに直接fillna()挿入できれば、完全を期すことができます。NaNNone

4

13 に答える 13

283

パンダ0.13なので、私df.replace()は仕事をしていると思います:

df = pd.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'foo', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', '  '],         
], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))

# replace field that's entirely space (or empty) with NaN
print(df.replace(r'^\s*$', np.nan, regex=True))

生産:

                   A    B   C
2000-01-01 -0.532681  foo   0
2000-01-02  1.490752  bar   1
2000-01-03 -1.387326  foo   2
2000-01-04  0.814772  baz NaN
2000-01-05 -0.222552  NaN   4
2000-01-06 -1.176781  qux NaN

Temak指摘したようにdf.replace(r'^\s+$', np.nan, regex=True)、有効なデータに空白が含まれている場合に使用します。

于 2014-02-21T18:48:53.760 に答える
93

空の文字列とレコードをスペースのみで置き換えたい場合、正解は!:です。

df = df.replace(r'^\s*$', np.nan, regex=True)

受け入れられた答え

df.replace(r'\s+', np.nan, regex=True)

空の文字列を置き換えません!、少し更新された特定の例を試してみてください。

df = pd.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'fo o', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', ''],         
], columns='A B C'.split(), index=pd.date_range('2000-01-01','2000-01-06'))

また、「fo o」はスペースが含まれていますが、Nanに置き換えられていないことに注意してください。さらに、単純なことに注意してください。

df.replace(r'', np.NaN)

どちらも機能しません-試してみてください。

于 2017-12-14T10:20:12.177 に答える
39

どうですか:

d = d.applymap(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)

このapplymap関数は、データフレームのすべてのセルに関数を適用します。

于 2012-11-18T23:15:17.407 に答える
28

これは私がしました:

df = df.apply(lambda x: x.str.strip()).replace('', np.nan)

また

df = df.apply(lambda x: x.str.strip() if isinstance(x, str) else x).replace('', np.nan)

すべてのstrを削除してから、空のstrを。に置き換えることができますnp.nan

于 2016-04-29T09:34:48.197 に答える
9

CSVファイルからデータをエクスポートする場合は、次のように簡単にできます。

df = pd.read_csv(file_csv, na_values=' ')

これにより、データフレームが作成され、空白の値がNaとして置き換えられます。

于 2018-01-07T16:07:39.943 に答える
7

すべてのソリューションの中で最も単純なもの:

df = df.replace(r'^\s+$', np.nan, regex=True)
于 2018-03-22T14:44:17.380 に答える
4

単一の値に対して同等性をチェックする非常に高速で単純なソリューションの場合、このmaskメソッドを使用できます。

df.mask(df == ' ')
于 2017-11-03T22:48:51.003 に答える
2

これらはすべて正しい答えに近いですが、あなたのコードを読んでいる他の人にとって最も読みやすいままで、問題を解決するとは言いません。答えは、BrenBarnの答えとその答えの下にあるtuomasttikのコメントを組み合わせたものだと思います。BrenBarnの回答はisspace組み込みを利用していますが、OPが要求したように、空の文字列の削除をサポートしていません。これは、文字列をnullに置き換える標準的なユースケースであると考える傾向があります。

で書き直したので、または.applyで呼び出すことができます。pd.Seriespd.DataFrame


Python 3:

空の文字列または完全にスペースの文字列を置き換えるには:

df = df.apply(lambda x: np.nan if isinstance(x, str) and (x.isspace() or not x) else x)

完全にスペースの文字列を置き換えるには:

df = df.apply(lambda x: np.nan if isinstance(x, str) and x.isspace() else x)

Python 2でこれを使用するには、に置き換える必要がありstrますbasestring

Python 2:

空の文字列または完全にスペースの文字列を置き換えるには:

df = df.apply(lambda x: np.nan if isinstance(x, basestring) and (x.isspace() or not x) else x)

完全にスペースの文字列を置き換えるには:

df = df.apply(lambda x: np.nan if isinstance(x, basestring) and x.isspace() else x)
于 2019-05-12T04:05:16.230 に答える
2

これは私のために働いた。csvファイルをインポートするときに、na_values=''を追加しました。スペースはデフォルトのNaN値に含まれていません。

df= pd.read_csv(filepath,na_values = ' ')
于 2020-05-08T00:49:01.253 に答える
1
print(df.isnull().sum()) # check numbers of null value in each column

modifiedDf=df.fillna("NaN") # Replace empty/null values with "NaN"

# modifiedDf = fd.dropna() # Remove rows with empty values

print(modifiedDf.isnull().sum()) # check numbers of null value in each column
于 2018-09-29T20:31:29.010 に答える
0

これは洗練されたソリューションではありませんが、機能しているように見えるのは、XLSXに保存してから、インポートして戻すことです。このページの他の解決策は私にはうまくいきませんでした。理由はわかりません。

data.to_excel(filepath, index=False)
data = pd.read_excel(filepath)
于 2019-01-14T05:02:20.313 に答える
0

これはうまくいくはずです

df.loc[df.Variable == '', 'Variable'] = 'Value'

また

df.loc[df.Variable1 == '', 'Variable2'] = 'Value'
于 2020-10-08T10:54:27.460 に答える
-3

フィルタを使用してそれを行うこともできます。

df = PD.DataFrame([
    [-0.532681, 'foo', 0],
    [1.490752, 'bar', 1],
    [-1.387326, 'foo', 2],
    [0.814772, 'baz', ' '],     
    [-0.222552, '   ', 4],
    [-1.176781,  'qux', '  '])
    df[df=='']='nan'
    df=df.astype(float)
于 2018-02-01T10:14:45.387 に答える