2013-04-15 89 views
5

我正在處理幾個出租車數據集。我已經使用熊貓將所有數據集連接成一個數據框。從熊貓數據框中的多行中提取非nan值

我的數據框看起來像這樣。

     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 

其中675,1039是出租車ID。基本上共有127輛出租車的相應的緯度和經度顯示出來。

我有幾種方法來提取行的非空值。

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

任何上述命令將返回的,

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

現在我想提取前幾行中的所有NOTNULL值(從第1行說到行6)。

我該怎麼做?

我可以循環它。但我想要一個非循環的方式來做到這一點。

任何幫助,建議,歡迎。 謝謝! :)

回答

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

作爲負責人,irow將在下一版熊貓不推薦使用。新方法,使用更清晰,取而代之。

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

+0

非常感謝你的信息。但顯然你提到的命令不是我想要的:(:(連續,我需要提取所有notnull值。=>多行,沒有迭代,我可以以更緊湊的方式做到這一點是問題。你這麼多回復:) – user2179627

2

在0.11(0.11rc1什麼了!),這是非常容易使用.iloc先選擇第6行,然後dropna滴任何行與nan(你也可以通過一些選項來dropna以控制要考慮到底是哪列)

我意識到你要1:6,我沒有0:在我的答案6 ....

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

沒有其他的,這不是我想要的。在你的例子中,2013-01-03行的列B和C是必要的,只有那些有Nan值的列不應該被考慮。 – user2179627

+0

如果你只想考慮列的一個子集,試試''dropna(subset = ['C'])'' – Jeff

0

使用傑夫的數據幀:

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 

我們可以通過一些數字,我們知道更換的NaN是不是在數據幀:

df = df.fillna(999) 

如果你想只保留非空值不反覆,你可以這樣做:

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

這種方法的問題是結果是列表,所以你失去了有關索引的信息。

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 

另一種選擇是:

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

在這種情況下,你不會失去有關索引的信息,雖然這確實是類似於以前的答案。

希望它有幫助!

相關問題