web-dev-qa-db-ja.com

パンダ:すべてのNaNを含む列をドロップします

データフレームからNaNsをドロップするのはdf.dropnaしかし、何らかの理由でそれは私のものに取り組んでいないと私は理由がわからない。

元のデータフレームは次のとおりです。

fish_frame1:                       0   1   2         3   4       5   6          7
0               #0915-8 NaN NaN       NaN NaN     NaN NaN        NaN
1                   NaN NaN NaN  LIVE WGT NaN  AMOUNT NaN      TOTAL
2               GBW COD NaN NaN     2,280 NaN   $0.60 NaN  $1,368.00
3               POLLOCK NaN NaN     1,611 NaN   $0.01 NaN     $16.11
4                 WHAKE NaN NaN       441 NaN   $0.70 NaN    $308.70
5           GBE HADDOCK NaN NaN     2,788 NaN   $0.01 NaN     $27.88
6           GBW HADDOCK NaN NaN    16,667 NaN   $0.01 NaN    $166.67
7               REDFISH NaN NaN       932 NaN   $0.01 NaN      $9.32
8    GB WINTER FLOUNDER NaN NaN       145 NaN   $0.25 NaN     $36.25
9   GOM WINTER FLOUNDER NaN NaN    25,070 NaN   $0.35 NaN  $8,774.50
10        GB YELLOWTAIL NaN NaN        26 NaN   $1.75 NaN     $45.50

以下のコードは、すべてのNaNsと、3つ以上のNaNs(いずれか、または両方が動作すると思います)を持つすべての列を削除する試みです。

fish_frame.dropna()
fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)

これにより、以下が生成されます。

fish_frame1 after dropna:                       0   1   2         3   4       5   6          7
0               #0915-8 NaN NaN       NaN NaN     NaN NaN        NaN
1                   NaN NaN NaN  LIVE WGT NaN  AMOUNT NaN      TOTAL
2               GBW COD NaN NaN     2,280 NaN   $0.60 NaN  $1,368.00
3               POLLOCK NaN NaN     1,611 NaN   $0.01 NaN     $16.11
4                 WHAKE NaN NaN       441 NaN   $0.70 NaN    $308.70
5           GBE HADDOCK NaN NaN     2,788 NaN   $0.01 NaN     $27.88
6           GBW HADDOCK NaN NaN    16,667 NaN   $0.01 NaN    $166.67
7               REDFISH NaN NaN       932 NaN   $0.01 NaN      $9.32
8    GB WINTER FLOUNDER NaN NaN       145 NaN   $0.25 NaN     $36.25
9   GOM WINTER FLOUNDER NaN NaN    25,070 NaN   $0.35 NaN  $8,774.50
10        GB YELLOWTAIL NaN NaN        26 NaN   $1.75 NaN     $45.50

私はPandasの初心者なので、何か間違ったことをしているのか、何かを誤解しているのか、コマンドを誤用しているので、これが機能しないのかわかりません。どんな助けでも感謝します。

6
theprowler

dropna docstringから:

    # drop the columns where all elements are NaN:

    >>> df.dropna(axis=1, how='all')
         A    B  D
    0  NaN  2.0  0
    1  3.0  4.0  1
    2  NaN  NaN  5
19
Corley Brigman

dropna()はnull値を削除し、dataFrameを返します。元のdataFrameに割り当てます。

fish_frame = fish_frame.dropna(axis = 1, how = 'all')

コードの参照:

fish_frame.dropna(thresh=len(fish_frame) - 3, axis=1)

これは、7個以上のNaNの列をドロップします(len(df)= 10と仮定)。前述のように3個以上のNanの列をドロップしたい場合、threshは3に等しくなければなりません。

3

dropna()はデフォルトでデータフレームを返します(デフォルトはinplace=False動作)、したがって、コードにとどまるためには、新しいデータフレームに割り当てる必要があります。

たとえば、

fish_frame = fish_frame.dropna()

dropnaが空のデータフレームを返す理由については、dropnaメソッドの "how"引数を確認することをお勧めします( https://pandas.pydata.org/pandas-docs /stable/generated/pandas.DataFrame.dropna.html )。また、axis = 0は列に対応し、axis = 1は行に対応することに留意してください。

したがって、すべての「NA」、axis = 0、how = "any"の列を削除するには、次のトリックを実行する必要があります。

fish_frame = fish_frame.dropna(axis=0, how="any")

最後に、「thresh」引数は、ドロップが発生するために必要なNAの数を明示的に指定します。そう

fish_frame = fish_frame.dropna(axis=0, thresh=3, how="any") 

3つのNAを持つ列を削除するには、うまく機能する必要があります。

また、Corleyが指摘したように、how = "any"はデフォルトであるため、必要ありません。

2