如何在熊猫中矢量化多个条件

时间:2018-05-28 17:35:18

标签: python pandas dataframe

我在python 3.5.2和pandas 0.18.1

中尝试这个

以下是我的示例数据

    %busy   %queue
1   50      3.0
2   80      2.0
3   90      3.0
4   90      3.0
5   90      3.0
6   30      1.1
7   45      1.3
8   55      1.5
9   65      1.7

以下是我的代码

import pandas as pd
df = pd.read_csv('cpu.csv')
total_row = df.shape[0]
for i in range(0, total_row):
  if df['busy'].iloc[i:i+3] >90 & df['queue'].iloc[i:i+3] => 3:
       print("High usage observed")
       break 
  else:
      continue

输出应为:

if条件应该评估True或False,如果是, 打印(“观察到高使用率”)

注意:IF循环仅在i = 2的值期间变为TRUE,从i = 2到i = 4, %busy大于90且%queue等于3,因此条件需要满足并且print语句被执行

我的期望是,声明df ['busy']。iloc [i:i + 3]> 90,应该给出True或False 类似地,第二个语句df ['queue']。iloc [i:i + 3]> 3,应该是真还是假

最后if循环应该是,True&是的,比循环内部的语句需要执行

但目前我收到的错误如下 ValueError:Series的真值是不明确的。使用a.empty,a.bool(),a.item(),a.any()或a.all()。

2 个答案:

答案 0 :(得分:0)

您应该使用矢量化计算来完成此任务。

以下是使用np.minimumpd.Series.shift的示例:

b = df['%busy']
q = df['%queue']

mask1 = np.minimum.reduce((b, b.shift(-1), b.shift(-2))) >= 90
mask2 = np.minimum.reduce((q, q.shift(-1), q.shift(-2))) >= 3

df['high_usage_marker'] = mask1 & mask2

print(df)

   %busy  %queue  high_usage_marker
1     50     3.0              False
2     80     2.0              False
3     90     3.0               True
4     90     3.0              False
5     90     3.0              False
6     30     1.1              False
7     45     1.3              False
8     55     1.5              False
9     65     1.7              False

答案 1 :(得分:0)

您似乎正在尝试执行滚动操作。为此,您可以使用内置于pandas rolling()对象中的Series函数。

举个例子:

df["status_busy"] = (df[::-1].busy.rolling(3).apply(lambda b: all(b >= 90))[::-1] *\
                     df[::-1].queue.rolling(3).apply(lambda q: all(q >= 3))[::-1]).fillna(0).astype(bool)



    busy    queue   status_busy
1   50  3.0         False
2   80  2.0         False
3   90  3.0         True
4   90  3.0         False
5   90  3.0         False
6   30  1.1         False
7   45  1.3         False
8   55  1.5         False
9   65  1.7         False

我用[::-1]反转值来进行前瞻性的滚动操作。默认为向后看,只需删除[::-1]

即可