Python 从数据帧中的多行提取非nan值的步骤
我正在研究几个出租车数据集。我使用pandas将所有数据集合并到一个数据帧中 我的数据框看起来像这样Python 从数据帧中的多行提取非nan值的步骤,python,python-2.7,numpy,dataframe,pandas,Python,Python 2.7,Numpy,Dataframe,Pandas,我正在研究几个出租车数据集。我使用pandas将所有数据集合并到一个数据帧中 我的数据框看起来像这样 675 1039 #and rest 125 taxis longitude latitude longitude latitude date 2008-02-02 13:31:21 116.56359 40.064
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
其中6751039是出租车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
现在,我想从前几行(比如从第1行到第6行)提取所有notnull值。我该怎么做 我大概可以把它循环起来。但我想要一种非循环的方式 欢迎任何帮助和建议。 在adv中表示感谢!:) 值得注意的是,
irow
将在熊猫的下一个版本中被弃用。使用更清晰的新方法取代它
在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
使用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
df = df.fillna(999)
我们可以用一些我们知道不在数据帧中的数字替换NAN:
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
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]
在这种情况下,您不会丢失有关索引的信息,尽管这与前面的答案非常相似
希望有帮助 不,事实上那不是我想要的。在您的示例中,需要2013-01-03行的B列和C列。不应仅考虑具有Nan值的列。但是,真的谢谢你的建议。如果你只想考虑列的一个子集,试试<代码> DROPNA(子集= [c])< <代码>谢谢你的信息。但很明显,您提到的命令不是我想要的:(:(在一行中,我需要提取所有notnull值。=>对于几行,不需要迭代,我可以以更紧凑的方式执行吗?非常感谢您的回答:)