对数据帧进行条件迭代

时间:2016-08-16 20:37:53

标签: python pandas

我有一个数据框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的行?

非常感谢

3 个答案:

答案 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