一个机器的运行周期内,内部有两个内机(不会同时运行),判断这个运行周期内,单独只运行某一个内机的情况下,该周期保留,如果该周期内,出现两个内机都有运行的阶段时,或者都没有运行的阶段时,该周期剔除。
构造一组数据说明情况,0表示关机,1表示开机
import pandas as pd
df = pd.DataFrame({
'内机1': [0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0],
'内机2': [1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1]
}, index=pd.date_range(start='2021-08-31 00:00:00', periods=11, freq='min'))
out:
内机1 内机2
2021-08-31 00:00:00 0 1
2021-08-31 00:01:00 1 0
2021-08-31 00:02:00 0 1
2021-08-31 00:03:00 0 1
2021-08-31 00:04:00 0 1
2021-08-31 00:05:00 0 1
2021-08-31 00:06:00 0 1
2021-08-31 00:07:00 0 1
2021-08-31 00:08:00 0 1
2021-08-31 00:09:00 0 1
2021-08-31 00:10:00 0 1
还未了解到any和all的使用方法时,我是直接判断两列是否都有大于0的情况,代码如下:
# 判断这两个DataFrame对象是否不同时为empty
df[df['内机1'] > 0].empty
df[df['内机2'] > 0].empty
if (df[df['内机1'] > 0].empty or not df[df['内机2'] > 0].empty) or (df[df['内机2'] > 0].empty or not df[df['内机1'] > 0].empty):
# 满足此条件则这个周期保留
判断条件一看挺复杂的,自从有了any和all之后,非常方便
# 拆分三步走
# 第一步,判断元素大于0的情况
df.loc[:,['内机1','内机2']] > 0
out:
内机1 内机2
2021-08-31 00:00:00 False True
2021-08-31 00:01:00 True False
2021-08-31 00:02:00 False True
2021-08-31 00:03:00 False True
2021-08-31 00:04:00 False True
2021-08-31 00:05:00 False True
2021-08-31 00:06:00 False True
2021-08-31 00:07:00 False True
2021-08-31 00:08:00 False True
2021-08-31 00:09:00 False True
2021-08-31 00:10:00 False True
# 第二步,判断每列是否有True的情况
(df.loc[:,['内机1','内机2']] > 0).any()
out:
内机1 True
内机2 True
dtype: bool
# 第三步,判断该Series对象是否都为True,都为True的话,该周期剔除
(df.loc[:,['内机1','内机2']] > 0).any().all()
out:
True
无论是pandas的any和all还是python内置的any和all,都是非常好用的方法,结合应用到不同的场景之中,可以使代码更为的简洁易懂