2015-11-10 12 views
5

対応する列のすべてのインデックスをNaN値を含む各行に対して取得しようとします。パンダデータフレーム内のNaN値のインデックスを取得

d=[[11.4,1.3,2.0, NaN],[11.4,1.3,NaN, NaN],[11.4,1.3,2.8, 0.7],[NaN,NaN,2.8, 0.7]] 
df = pd.DataFrame(data=d, columns=['A','B','C','D']) 
print df 

     A B C D 
0 11.4 1.3 2.0 NaN 
1 11.4 1.3 NaN NaN 
2 11.4 1.3 2.8 0.7 
3 NaN NaN 2.8 0.7 

私はすでに次のことをやった:

  • は、各行のためのNaNのカウント
  • でカラムを追加NaNの

値を含む各列のインデックスを取得します私が望むもの(理想的には列の名前)は、次のようなリストを得ます:

[ ['D'],['C','D'],['A','B'] ] 

希望私は私の巨大なデータセットを扱うことができるようにするパンダの方法を探していた各列

if df.ix[i][column] == NaN: 

のために、行ごとにテストを行うことなく、方法を見つけることができます。

ありがとうございます。

+0

すでにNaN vを含む各行のインデックスが見つかりました。注意書き。私が望むのは、各行の列のインデックスです。申し訳ありませんが説明が不明な場合。 – dooms

答えて

2

もう一つの方法は、NaNである行を抽出します。

In [11]: df_null = df.isnull().unstack() 

In [12]: t = df_null[df_null] 

In [13]: t 
Out[13]: 
A 3 True 
B 3 True 
C 1 True 
D 0 True 
    1 True 
dtype: bool 

これはあなたの道のほとんどを取得し、十分かもしれません。
シリーズで動作するように簡単かもしれないが:

In [14]: s = pd.Series(t2.index.get_level_values(1), t2.index.get_level_values(0)) 

In [15]: s 
Out[15]: 
0 D 
1 C 
1 D 
3 A 
3 B 
dtype: object 

例えばあなたはリスト(私はあなたがそれらを必要とは思わないが)

In [16]: s.groupby(level=0).apply(list) 
Out[16]: 
0  [D] 
1 [C, D] 
3 [A, B] 
dtype: object 
+0

これは明らかに最も厄介な方法ですが、@maxymooよりも100倍遅い – dooms

+0

@doomsは適用を意味していますか? –

+0

大きなデータセット上の@dooms最初の数は非常に速くなければなりません。 –

3

NULL値の座標を取得するためにscipyのダウンロード座標形式のスパース行列を使用して効率的にする必要があります:私はちょうど出力するために、座標をnonzeroメソッドを呼んでいる

import scipy.sparse as sp 

x,y = sp.coo_matrix(df.isnull()).nonzero() 
print(list(zip(x,y))) 

[(0, 3), (1, 2), (1, 3), (3, 0), (3, 1)] 

注意私は実際の値がすべてTrueであるかどうかは気にしないので、基礎となる疎行列の非ゼロエントリです。

+0

このソリューションは(Alexander'sより)2倍高速ですが、この種のデータをナビゲートする方法はわかりません。リストのように簡単ではない – dooms

+0

素晴らしい解決策、ありがとう! –

1

データフレーム内の各行を繰り返し処理し、ヌル値のマスクを作成し、インデックス(データフレーム内の列)を出力できます。

lst = [] 
for _, row in df.iterrows(): 
    mask = row.isnull() 
    lst += [row[mask].index.tolist()] 

>>> lst 
[['D'], ['C', 'D'], [], ['A', 'B']] 
0

を望んでいた場合は、別の簡単な方法は次のとおりです。

>>> bool_idx = df.isnull().any(axis=1) 
>>> df[bool_idx] 
    A   B  C D 
0 11.4 1.3  2.0 NaN 
1 11.4 1.3  NaN NaN 
3 NaN  NaN 2.8 0.7 

を整数のインデックスを取得するには:サブセットに

>>>df.isnull().any(axis=1) 
0  True 
1  True 
2 False 
3  True 
dtype: bool 

>>> df[bool_idx].index 
Int64Index([0, 1, 3], dtype='int64') 
関連する問題