迭代pandas数据帧的最快方法?

use*_*204 4 python database ipython python-2.7 pandas

如何运行数据框并仅返回满足特定条件的行?必须在先前的行和列上测试此条件.例如:

          #1    #2    #3    #4
1/1/1999   4     2     4     5
1/2/1999   5     2     3     3
1/3/1999   5     2     3     8
1/4/1999   6     4     2     6
1/5/1999   8     3     4     7
1/6/1999   3     2     3     8
1/7/1999   1     3     4     1
Run Code Online (Sandbox Code Playgroud)

我想测试每一行的几个条件,如果所有条件都通过,我想将行追加到列表中.例如:

for row in dataframe:
    if [row-1, column 0] + [row-2, column 3] >= 6:
        append row to a list
Run Code Online (Sandbox Code Playgroud)

对于要返回的行,我最多可能有3个条件.考虑这样做的方法是为所有观察结果制作一个列表,对每个条件都是真实的,然后为所有三个列表中出现的所有行创建一个单独的列表.

我的两个问题如下:

根据以前的行获取满足特定条件的所有行的最快方法是什么?循环遍历5,000行的数据帧似乎可能太长了.特别是如果必须测试可能的3个条件.

获得满足所有3个条件的行列表的最佳方法是什么?

unu*_*tbu 6

选择行的最快方法是迭代数据帧的行.相反,为要选择的行创建一个具有True值的掩码(布尔数组),然后调用df[mask]以选择它们:

mask = (df['column 0'].shift(1) + df['column 3'].shift(2) >= 6)
newdf = df[mask]
Run Code Online (Sandbox Code Playgroud)

要将多个条件与逻辑 - 结合使用,请使用&:

mask = ((...) & (...))
Run Code Online (Sandbox Code Playgroud)

对于逻辑或使用|:

mask = ((...) | (...))
Run Code Online (Sandbox Code Playgroud)

例如,

In [75]: df = pd.DataFrame({'A':range(5), 'B':range(10,20,2)})

In [76]: df
Out[76]: 
   A   B
0  0  10
1  1  12
2  2  14
3  3  16
4  4  18

In [77]: mask = (df['A'].shift(1) + df['B'].shift(2) > 12)

In [78]: mask
Out[78]: 
0    False
1    False
2    False
3     True
4     True
dtype: bool

In [79]: df[mask]
Out[79]: 
   A   B
3  3  16
4  4  18
Run Code Online (Sandbox Code Playgroud)