131

pd.DataFrameいくつかの Excel スプレッドシートを解析して作成した があります。空のセルを持つ列。たとえば、以下はその列の頻度の出力で、32320 レコードにTenantの欠損値があります。

>>> value_counts(Tenant, normalize=False)
                              32320
    Thunderhead                8170
    Big Data Others            5700
    Cloud Cruiser              5700
    Partnerpedia               5700
    Comcast                    5700
    SDP                        5700
    Agora                      5700
    dtype: int64

テナントが欠落している行を削除しようとしていますが、.isnull()オプションは欠落している値を認識しません。

>>> df['Tenant'].isnull().sum()
    0

列のデータ型は「オブジェクト」です。この場合、何が起こっていますか?テナントが見つからないレコードを削除するにはどうすればよいですか?

4

6 に答える 6

239

np.nan値がオブジェクトの場合、Pandas は値を null として認識NaNし、DataFrame のように出力します。欠落している値はおそらく空の文字列であり、Pandas は null として認識しません。これを修正するには、空の文字列 (または空のセルにあるもの) をnp.nanを使用してオブジェクトに変換し、DataFrame をreplace()呼び出して null テナントの行を削除します。dropna()

実証するために、列にいくつかのランダムな値といくつかの空の文字列を含む DataFrame を作成しTenantsます。

>>> import pandas as pd
>>> import numpy as np
>>> 
>>> df = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
>>> df['Tenant'] = np.random.choice(['Babar', 'Rataxes', ''], 10)
>>> print df

          A         B   Tenant
0 -0.588412 -1.179306    Babar
1 -0.008562  0.725239         
2  0.282146  0.421721  Rataxes
3  0.627611 -0.661126    Babar
4  0.805304 -0.834214         
5 -0.514568  1.890647    Babar
6 -1.188436  0.294792  Rataxes
7  1.471766 -0.267807    Babar
8 -1.730745  1.358165  Rataxes
9  0.066946  0.375640         

Tenants次のように、列内の空の文字列をnp.nanオブジェクトに置き換えます。

>>> df['Tenant'].replace('', np.nan, inplace=True)
>>> print df

          A         B   Tenant
0 -0.588412 -1.179306    Babar
1 -0.008562  0.725239      NaN
2  0.282146  0.421721  Rataxes
3  0.627611 -0.661126    Babar
4  0.805304 -0.834214      NaN
5 -0.514568  1.890647    Babar
6 -1.188436  0.294792  Rataxes
7  1.471766 -0.267807    Babar
8 -1.730745  1.358165  Rataxes
9  0.066946  0.375640      NaN

これで、null 値を削除できます。

>>> df.dropna(subset=['Tenant'], inplace=True)
>>> print df

          A         B   Tenant
0 -0.588412 -1.179306    Babar
2  0.282146  0.421721  Rataxes
3  0.627611 -0.661126    Babar
5 -0.514568  1.890647    Babar
6 -1.188436  0.294792  Rataxes
7  1.471766 -0.267807    Babar
8 -1.730745  1.358165  Rataxes
于 2015-03-28T07:46:29.167 に答える
40

value_counts はデフォルトで NaN を省略しているため、"" を扱っている可能性が高いです。

したがって、次のようにフィルターで除外できます

filter = df["Tenant"] != ""
dfNew = df[filter]
于 2015-03-28T16:19:17.380 に答える