我有一个数据框df
,如下所示:
id location grain
0 BBG.XETR.AD.S XETR 16.545
1 BBG.XLON.VB.S XLON 6.2154
2 BBG.XLON.HF.S XLON NaN
3 BBG.XLON.RE.S XLON NaN
4 BBG.XLON.LL.S XLON NaN
5 BBG.XLON.AN.S XLON 3.215
6 BBG.XLON.TR.S XLON NaN
7 BBG.XLON.VO.S XLON NaN
实际上,这个数据框架会更大。我想迭代这个数据帧返回'grain'
值,但我只对在' grain'中具有值(不是NaN)的行感兴趣。柱。因此,只有在迭代数据帧时返回以下值:
16.545
6.2154
3.215
我可以使用以下方法迭代数据框:
for staticidx, row in df.iterrows():
value= row['grain']
但是这会为所有行返回一个值,包括那些具有NaN值的行。有没有办法从数据框中删除NaN行或跳过数据框中的粒子等于NaN的行?
非常感谢
答案 0 :(得分:1)
您可以在dropna
中指定要对数据进行子集化的列列表:
子集:类似数组 沿着其他轴的标记要考虑,例如如果你要丢弃行 这些将是要包括的列的列表
>>> df.dropna(subset=['grain'])
id location grain
0 BBG.XETR.AD.S XETR 16.5450
1 BBG.XLON.VB.S XLON 6.2154
5 BBG.XLON.AN.S XLON 3.2150
答案 1 :(得分:0)
此:
df[pd.notnull(df['grain'])]
或者这个:
df['grain].dropna()
答案 2 :(得分:0)
让我们比较不同的方法(对于800K行DF):
In [21]: df = pd.concat([df] * 10**5, ignore_index=True)
In [22]: df.shape
Out[22]: (800000, 3)
In [23]: %timeit df.grain[~pd.isnull(df.grain)]
The slowest run took 5.33 times longer than the fastest. This could mean that an intermediate result is being cached.
100 loops, best of 3: 17.1 ms per loop
In [24]: %timeit df.ix[df.grain.notnull(), 'grain']
10 loops, best of 3: 23.9 ms per loop
In [25]: %timeit df[pd.notnull(df['grain'])]
10 loops, best of 3: 35.9 ms per loop
In [26]: %timeit df.grain.ix[df.grain.notnull()]
100 loops, best of 3: 17.4 ms per loop
In [27]: %timeit df.dropna(subset=['grain'])
10 loops, best of 3: 56.6 ms per loop
In [28]: %timeit df.grain[df.grain.notnull()]
100 loops, best of 3: 17 ms per loop
In [30]: %timeit df['grain'].dropna()
100 loops, best of 3: 16.3 ms per loop