我在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()。
答案 0 :(得分:0)
您应该使用矢量化计算来完成此任务。
以下是使用np.minimum
和pd.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]