2016-08-23 7 views
0

誰かが私を助けてくれることを願っています。私はPythonの初心者です。私は、111列と40 000行以上のデータフレームを持っています。すべての列にはNaN値が含まれています(一部の列には他の列より多くのNaNが含まれています)。したがって、少なくとも80%のNaN値を持つ列を削除します。これどうやってするの?私の問題を解決するためにPythonでは、NaNの数に関する条件を満たすデータフレームの列を選択するにはどうすればよいですか?

、私は機能x.isnull().sum()/len(x)は、xの長さ列XでのNaNの数を分割することであり、一部< 0.8はそれらを選択することで、次のコード

df1=df.apply(lambda x : x.isnull().sum()/len(x) < 0.8, axis=0) 

を試し80%未満のNaNを含むカラム。

問題は、このコードを実行すると、ブール値 "True"とともに列名が取得されますが、名前だけでなく列全体が必要な点です。私は何をすべきか?

+0

を使用すると、列の名前を持っている:

df = df[df.columns[df1]] 

または実行してコメントで示唆したよう

ドロップしたい場合は、元のデータフレームにpandasドロップ機能を使用することができます:http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.drop.html axis = 1を指定する必要がありますドロップコラム – Quickbeam2k1

+0

あなたはdf = df.drop(df1、axis = 1)のような意味ですか?それでも動作しない場合、私のデータフレームは変わりません。 – user322778

+0

いいえ、df.drop(cols、axis = 1、inplace = True)のような意味です。インプレースのために、列は列名ではありません。 – Quickbeam2k1

答えて

2

あなたはこれを行うことができます:

filt = df.isnull().sum()/len(df) < 0.8 
df1 = df.loc[:, filt] 
+1

ああ、あなたは私に賭けても...私は答えを残しておきます。 – jotasi

+1

ニース!ありがとうございました!これはちょうど完璧に動作します:) – user322778

2

あなたは二つのことを達成したいです。まず、すべての列のインデックスを見つける必要があります。インデックスは最大で80%です。NaNです。次に、あなたはDataFrameからそれらを捨てたいと思う。行がやっによって破棄されるべきかどうかを示すpandasSeriesを取得するには

、あなたが行うことができます。

df1 = df.isnull().sum(axis=0) < 0.8*df.shape[1] 

を(ところで、あなたは、あなたの質問にタイプミスがあり、それは常にテストとしてあなたは==Trueをドロップする必要があります。 .isnull()Trueを与える(またはAS

0.5==Trueかどうかこれは、維持するためのすべての列インデックスのTrueを与える1)は、有効な数のためNaN及びFalse(又は0)である場合すべての要素。次に、.sum(axis=0)は、列に沿って合計し、各列にNaNの数を与えます。その数が列数の80%より大きい場合、比較が行われます。 2番目のタスクのために

、あなたが使用してインデックスにあなたの列を、これを使用することができます。

df.drop(df.columns[df1==False], axis=1, inplace=True) 
+0

あなたの答えをありがとう、私は短いと完璧なので、他の1つを選択しました。私はあなたの答えをupvoteしたいと思いますが、私はできません:(しかし、とにかくそれを書いてくれてありがとう!) – user322778

+0

@ user322778問題はありません。誰か他の人が答えて、ここにそれを残しておきます。 – jotasi

関連する問題