2015-11-10 21 views
5

Tôi cố gắng truy xuất cho mỗi hàng có chứa giá trị NaN tất cả chỉ mục của các cột tương ứng.Truy xuất chỉ mục giá trị NaN trong khung dữ liệu gấu trúc

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 

Tôi đã thực hiện như sau:

  • thêm một cột với các tội danh NaN cho mỗi hàng
  • có được các chỉ số của mỗi hàng chứa NaN giá trị

Những gì tôi muốn (lý tưởng là tên của cột) là có được một danh sách như thế này:

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

Hy vọng tôi có thể tìm thấy một cách mà không làm cho mỗi hàng kiểm tra cho mỗi cột

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

Tôi đang tìm kiếm một cách gấu trúc để có thể đối phó với dữ liệu khổng lồ của tôi.

Xin cảm ơn trước.

+0

Tôi đã tìm thấy các chỉ mục của mỗi hàng có chứa NaN v alues. Những gì tôi muốn là chỉ số của các cột cho mỗi hàng. Xin lỗi nếu mô tả không rõ ràng. – dooms

Trả lời

2

Một cách khác, trích xuất các hàng mà là 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 

này giúp bạn hầu hết các con đường và có thể đủ.
Mặc dù nó có thể được dễ dàng hơn để làm việc với Series:

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 

ví dụ nếu bạn muốn danh sách (mặc dù tôi không nghĩ rằng bạn sẽ cần đến chúng)

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

điều này rõ ràng là cách "đáng giá nhất" nhưng chậm hơn 100 lần so với @maxymoo – dooms

+0

@ các phòng bạn có nghĩa là làm đơn đăng ký không? –

+0

@dooms trên tập dữ liệu lớn, số đầu tiên phải khá nhanh .. –

3

Nó phải là hiệu quả để sử dụng một scipy phối hợp định dạng ma trận thưa thớt để lấy tọa độ của các giá trị null:

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)] 

Lưu ý rằng tôi gọi phương thức nonzero để chỉ ra tọa độ của các mục không đẳng cấp trong ma trận thưa thớt cơ bản vì tôi không quan tâm đến các giá trị thực tế là tất cả True.

+0

giải pháp này nhanh gấp 2 lần (so với @ Alexander) nhưng tôi không biết cách điều hướng trong loại dữ liệu này. nó không dễ dàng như một giải pháp tuyệt vời trong danh sách – dooms

+0

, cảm ơn bạn! –

1

Bạn có thể lặp qua từng hàng trong khung dữ liệu, tạo mặt nạ giá trị rỗng và xuất chỉ mục của chúng (tức là các cột trong khung dữ liệu).

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

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

một cách khác đơn giản hơn là:

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

để tập hợp con:

>>> 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 

để có được chỉ số nguyên :

>>> df[bool_idx].index 
Int64Index([0, 1, 3], dtype='int64') 
Các vấn đề liên quan