2013-04-15 91 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] 

在这种情况下,你不会失去有关索引的信息,虽然这确实是类似于以前的答案。

希望它有帮助!

相关问题