2013-04-15 49 views
5

Tôi đang làm việc trên một số tập dữ liệu taxi. Tôi đã sử dụng gấu trúc để concat tất cả các tập dữ liệu vào một dataframe duy nhất.Để trích xuất các giá trị không phải nan từ nhiều hàng trong một khung dữ liệu gấu trúc

My dataframe trông giống như thế này.

     675      1039    #and rest 125 taxis 
        longitude  latitude longitude latitude 
date 
2008-02-02 13:31:21 116.56359 40.06489  Nan   Nan 
2008-02-02 13:31:51 116.56486 40.06415  Nan   Nan 
2008-02-02 13:32:21 116.56855 40.06352  116.58243 39.6313 
2008-02-02 13:32:51 116.57127 40.06324  Nan   Nan 
2008-02-02 13:33:21 116.57120 40.06328  116.55134 39.6313 
2008-02-02 13:33:51 116.57121 40.06329  116.55126 39.6123 
2008-02-02 13:34:21 Nan  Nan   116.55134 39.5123 

trong đó 675,1039 là id taxi. Về cơ bản có hoàn toàn 127 taxi có vĩ độ tương ứng và kinh độ của họ cột lên.

Tôi có một số cách để trích xuất các giá trị không null cho một hàng.

df.ix[k,df.columns[np.isnan(df.irow(0))!=1]] 
       (or) 
df.irow(0)[np.isnan(df.irow(0))!=1] 
       (or) 
df.irow(0)[np.where(df.irow(0)[df.columns].notnull())[0]] 

bất kỳ lệnh trên sẽ trở về,

675 longitude 116.56359 
     latitude  40.064890 
4549 longitude 116.34642 
     latitude  39.96662 
Name: 2008-02-02 13:31:21 

bây giờ tôi muốn trích xuất tất cả các giá trị notnull từ vài dòng đầu tiên (nói từ hàng 1 đến hàng 6).

làm cách nào để thực hiện điều đó?

tôi có thể lặp lại. Nhưng tôi muốn một cách không lặp lại để làm điều đó.

Mọi trợ giúp, đề xuất đều được chào đón. Cảm ơn bạn đã ủng hộ! :)

Trả lời

4
df.ix[1:6].dropna(axis=1) 

Là một người đứng đầu lên, irow sẽ được tán thành trong phiên bản tiếp theo của gấu trúc. Phương pháp mới, với cách sử dụng rõ ràng hơn, thay thế nó.

http://pandas.pydata.org/pandas-docs/dev/indexing.html#deprecations

+0

Cảm ơn bạn rất nhiều về thông tin. Nhưng dường như lệnh bạn đã đề cập không phải là thứ tôi muốn :(:(liên tiếp, tôi cần trích xuất tất cả các giá trị notnull. => Cho nhiều hàng, không lặp lại, tôi có thể làm điều đó theo cách nhỏ gọn hơn không. bạn có rất nhiều điều để trả lời :) – user2179627

2

Trong 0,11 (0.11rc1 là ra ngay bây giờ), điều này rất dễ dàng sử dụng .iloc lần đầu tiên chọn 6 hàng đầu tiên, sau đó dropna giảm bất kỳ liên tiếp với một nan (bạn cũng có thể vượt qua một số tùy chọn để dropna để kiểm soát chính xác cột mà bạn muốn xem xét)

tôi nhận ra bạn muốn 1: 6, tôi đã làm 0: 6 trong câu trả lời của tôi ....

In [8]: df = DataFrame(randn(10,3),columns=list('ABC'),index=date_range('20130101',periods=10)) 

In [9]: df.ix[6,'A'] = np.nan 

In [10]: df.ix[6,'B'] = np.nan 

In [11]: df.ix[2,'A'] = np.nan 

In [12]: df.ix[4,'B'] = np.nan 

In [13]: df.iloc[0:6] 
Out[13]: 
        A   B   C 
2013-01-01 0.442692 -0.109415 -0.038182 
2013-01-02 1.217950 0.006681 -0.067752 
2013-01-03  NaN -0.336814 -1.771431 
2013-01-04 -0.655948 0.484234 1.313306 
2013-01-05 0.096433  NaN 1.658917 
2013-01-06 1.274731 1.909123 -0.289111 

In [14]: df.iloc[0:6].dropna() 
Out[14]: 
        A   B   C 
2013-01-01 0.442692 -0.109415 -0.038182 
2013-01-02 1.217950 0.006681 -0.067752 
2013-01-04 -0.655948 0.484234 1.313306 
2013-01-06 1.274731 1.909123 -0.289111 
+0

Không thực sự thats không phải những gì tôi muốn.Trong ví dụ của bạn, 2013-01-03 hàng của cột B và C. là cần thiết.Chỉ có những cột với giá trị Nan không nên được xem xét.Nhưng thực sự cảm ơn cho đề xuất một cái gì đó – user2179627

+0

Nếu bạn chỉ muốn xem xét một tập con của các cột, hãy thử '' dropna (tập con = ['C']) '' – Jeff

0

Sử dụng dataframe Jeff:

import pandas as pd 
from numpy.random import randn 

df = pd.DataFrame(randn(10,3),columns=list('ABC'),index=pd.date_range('20130101',periods=10)) 
df.ix[6,'A'] = np.nan 
df.ix[6,'B'] = np.nan 
df.ix[2,'A'] = np.nan 
df.ix[4,'B'] = np.nan 

Chúng tôi có thể thay thế Nans bởi một số số chúng ta đều biết không có trong dataframe:

df = df.fillna(999) 

Nếu bạn muốn giữ lại chỉ có giá trị khác null mà không lặp lại bạn có thể làm:

df_nona = df.apply(lambda x: list(filter(lambda y: y != 999, x))) 
df_na = df.apply(lambda x: list(filter(lambda y: y == 999, x))) 

Vấn đề của phương pháp này là kết quả là danh sách, do đó bạn sẽ mất thông tin về chỉ mục.

df_nona 
A [-1.9804955861, 0.146116306853, 0.359075672435... 
B [-1.01963803293, -0.829747654648, 0.6950551455... 
C [2.40122968044, 0.79395493777, 0.484201174184,... 
dtype: object 

lựa chọn khác là:

df1 = df.dropna() 
index_na = df.index^df1.index 
df_na = df[index_na] 

Trong trường hợp này bạn không bị mất thông tin về chỉ số, mặc dù điều này là thực sự giống với câu trả lời trước.

Hy vọng điều đó sẽ hữu ích!

Các vấn đề liên quan