通过熊猫数据框迭代的最快方法?
问题描述:
如何运行一个数据框并只返回满足特定条件的行?必须在前面的行和列上测试此情况。例如:通过熊猫数据框迭代的最快方法?
#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
我想测试于各行的几个条件,如果所有条件都过去了,我想追加行上市。例如:
for row in dataframe:
if [row-1, column 0] + [row-2, column 3] >= 6:
append row to a list
我最多可能有3个条件,对于要返回的行必须为true。 正在考虑这样做的方法是为每个条件制定一个真实 的观察列表,然后为所有出现在所有三个列表中的所有行制作单独的列表。
我的两个问题有以下几点:
什么是让所有符合基于先前行一定条件的行的最快的方法是什么?通过5000行数据帧循环似乎可能太长。特别是如果有潜在的3个条件需要测试。
获得满足所有3个条件的行列表的最佳方式是什么?
答
选择行的最快方法是对而不是遍历数据帧的行。相反,创建一个掩码(布尔数组)与您要选择的行真值,然后调用df[mask]
选择它们:
mask = (df['column 0'].shift(1) + df['column 3'].shift(2) >= 6)
newdf = df[mask]
要使用逻辑和,使用结合多个条件&
:
mask = ((...) & (...))
对于逻辑或使用|
:
mask = ((...) | (...))
例如,
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
谢谢!正是我在找什么! – user1367204