2015-03-28 34 views
19

Tôi có một pd.DataFrame đã được tạo bằng cách phân tích cú pháp một số bảng tính excel. Một cột trong đó có các ô trống. Ví dụ, dưới đây là đầu ra cho tần số của cột đó, 32320 bản ghi có giá trị thiếu cho Người thuê.Python Pandas DataFrame loại bỏ các ô trống

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

Tôi đang cố gắng xóa các hàng trong đó Người thuê bị thiếu, tuy nhiên tùy chọn isnull không nhận ra các giá trị bị thiếu.

In [71]: df['Tenant'].isnull().sum() 
    Out[71]: 0 

Cột có loại dữ liệu "Đối tượng". Điều gì đang xảy ra trong trường hợp này? Làm thế nào tôi có thể thả các bản ghi mà Người thuê nhà bị thiếu?

Trả lời

40

Pandas sẽ nhận ra một giá trị là null nếu nó là đối tượng np.nan, sẽ in dưới dạng NaN trong DataFrame. Các giá trị bị thiếu của bạn có thể là các chuỗi rỗng, mà Pandas không nhận ra là rỗng. Để khắc phục điều này, bạn có thể chuyển đổi các giá trị trống (hoặc bất kỳ ô nào trong ô trống) thành np.nan đối tượng bằng cách sử dụng replace() và sau đó gọi dropna() trên DataFrame của bạn để xóa các hàng có đối tượng thuê rỗng.

Để chứng minh, tôi tạo ra một DataFrame với một số giá trị ngẫu nhiên và một số chuỗi rỗng trong một cột 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   

Bây giờ tôi thay thế bất kỳ chuỗi rỗng trong cột Tenants với np.nan đối tượng, như vậy:

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

Bây giờ tôi có thể thả các giá trị 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 
+0

Cảm ơn rất nhiều, tôi sẽ cung cấp cho một thử này và trở lại! –

+1

@mcmath, một chút tò mò. Tại sao bạn nhập numpy và sử dụng 'np.nan' khi bạn có thể làm' pd.np.nan'? – propjk007

+2

@ propjk007, như với nhiều thứ trong cuộc sống, có rất nhiều cách để làm nhiều điều – andrew

15

giá trị_counts bỏ qua NaN theo mặc định, do đó bạn có nhiều khả năng xử lý "" nhất.

Vì vậy, bạn chỉ có thể lọc chúng ra như

filter = df["Tenant"] != "" 
dfNew = df[filter] 
+0

cảm ơn rất nhiều! Giải pháp @Bobs –

+0

không hoạt động đối với tôi. df.dropna (tập hợp con = ['đối tượng thuê'], inplace = True) hoạt động. –

+1

Xin lỗi về điều đó. Tôi nghĩ bạn đã xử lý "" s. Bạn nên đăng giải pháp của mình dưới dạng câu trả lời –

1

Bạn có thể sử dụng sự thay đổi này:

import pandas as pd 
vals = { 
    'name' : ['n1', 'n2', 'n3', 'n4', 'n5', 'n6', 'n7'], 
    'gender' : ['m', 'f', 'f', 'f', 'f', 'c', 'c'], 
    'age' : [39, 12, 27, 13, 36, 29, 10], 
    'education' : ['ma', None, 'school', None, 'ba', None, None] 
} 
df_vals = pd.DataFrame(vals) #converting dict to dataframe 

chí đầu ra này (** - làm nổi bật hàng chỉ mong muốn):

age education gender name 
0 39  ma  m n1 ** 
1 12  None  f n2  
2 27 school  f n3 ** 
3 13  None  f n4 
4 36  ba  f n5 ** 
5 29  None  c n6 
6 10  None  c n7 

Vì vậy, để thả mọi thứ không có giá trị 'giáo dục', hãy sử dụng mã bên dưới:

df_vals = df_vals[~df_vals['education'].isnull()] 

('~' chỉ NOT)

Kết quả:

age education gender name 
0 39  ma  m n1 
2 27 school  f n3 
4 36  ba  f n5 
Các vấn đề liên quan