Python 如何根据列中的条件进行计算?

Python 如何根据列中的条件进行计算?,python,pandas,series,Python,Pandas,Series,我想计算一下,当有一群人在不断地跟随时 我有一个关于压缩机工作原理的数据库。每5分钟,如果压缩机处于打开/关闭状态,我就会得到压缩机状态,以及此时消耗的电量。当压缩机工作时(打开),列On\u Off有1,当压缩机工作时(关闭),列0 Compresor = pd.Series([0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,1,1,0], index = pd.date_range('1/1/2012', periods=18, freq='5 min')) df = pd.Da

我想计算一下,当有一群人在不断地跟随时

我有一个关于压缩机工作原理的数据库。每5分钟,如果压缩机处于打开/关闭状态,我就会得到压缩机状态,以及此时消耗的电量。当压缩机工作时(打开),列
On\u Off
1
,当压缩机工作时(关闭),列
0

Compresor = pd.Series([0,0,1,1,1,0,0,1,1,1,0,0,0,0,1,1,1,0], index = pd.date_range('1/1/2012', periods=18, freq='5 min'))
df = pd.DataFrame(Compresor)
df.index.rename("Date", inplace=True)
df.set_axis(["ON_OFF"], axis=1, inplace=True)
df.loc[(df.ON_OFF == 1), 'Electricity'] = np.random.randint(4, 20, df.sum())
df.loc[(df.ON_OFF < 1), 'Electricity'] = 0
df


                             ON_OFF     Electricity
      Date              
      2012-01-01 00:00:00       0       0.0
      2012-01-01 00:05:00       0       0.0
      2012-01-01 00:10:00       1       4.0
      2012-01-01 00:15:00       1       10.0
      2012-01-01 00:20:00       1       9.0
      2012-01-01 00:25:00       0       0.0
      2012-01-01 00:30:00       0       0.0
      2012-01-01 00:35:00       1       17.0
      2012-01-01 00:40:00       1       10.0
      2012-01-01 00:45:00       1       5.0
      2012-01-01 00:50:00       0       0.0
      2012-01-01 00:55:00       0       0.0
      2012-01-01 01:00:00       0       0.0
      2012-01-01 01:05:00       0       0.0
      2012-01-01 01:10:00       1       14.0
      2012-01-01 01:15:00       1       5.0
      2012-01-01 01:20:00       1       19.0
      2012-01-01 01:25:00       0       0.0
compressor=pd.系列([0,0,1,1,1,0,0,1,1,0,0,0,0,1,1,1,0],索引=pd.日期范围('1/1/2012',周期=18,频率=5分钟'))
df=pd.数据帧(压缩机)
重命名(“日期”,inplace=True)
df.设置_轴([“开_关”],轴=1,在位=真)
df.loc[(df.ON\u OFF==1),“电”]=np.random.randint(4,20,df.sum())
df.loc[(df.ON_OFF<1),“电”]=0
df
开关电源
日期
2012-01-01 00:00:00       0       0.0
2012-01-01 00:05:00       0       0.0
2012-01-01 00:10:00       1       4.0
2012-01-01 00:15:00       1       10.0
2012-01-01 00:20:00       1       9.0
2012-01-01 00:25:00       0       0.0
2012-01-01 00:30:00       0       0.0
2012-01-01 00:35:00       1       17.0
2012-01-01 00:40:00       1       10.0
2012-01-01 00:45:00       1       5.0
2012-01-01 00:50:00       0       0.0
2012-01-01 00:55:00       0       0.0
2012-01-01 01:00:00       0       0.0
2012-01-01 01:05:00       0       0.0
2012-01-01 01:10:00       1       14.0
2012-01-01 01:15:00       1       5.0
2012-01-01 01:20:00       1       19.0
2012-01-01 01:25:00       0       0.0
我想做的是仅在有一组耗电量时添加耗电量,然后再制作另一个
Data.Frame
。例如:

在本例中,压缩机第一次打开的时间是在00:20-00:30之间。在此期间,它消耗了25(10+10+5)。第二次持续时间更长(00:50-01:15),并在该时间间隔内消耗50(10+10+10+10+5+5)。第三次消耗20(10+10)


我想自动执行此操作我对pandas还不熟悉,我想不出一种方法来执行此操作。

我要做的是创建一个变量,用一个整数作为ID表示每个活动周期,然后按它分组,并对
电力
列求和。创建它的一种简单方法是通过累计求和
开/关
(数据必须按增加的日期排序)并将结果值乘以
开/关
列。如果您提供了一个可复制的熊猫表示例,我可以很快将解决方案写给您


希望它有帮助

假设您有以下数据:

from operator import itemgetter

import numpy as np
import numpy.random as rnd
import pandas as pd
from funcy import concat, repeat
from toolz import partitionby

base_data = {
    'time': list(range(20)),
    'state': list(concat(repeat(0, 3), repeat(1, 4), repeat(0, 5), repeat(1, 6), repeat(0, 2))),
    'value': list(concat(repeat(0, 3), rnd.randint(5, 20, 4), repeat(0, 5), rnd.randint(5, 20, 6), repeat(0, 2)))
}

嗯,有两种方法:

第一个是功能性的,独立于
pandas
:您只需将数据按字段进行
分区,即该方法按顺序处理数据,并在每次字段值更改时生成新分区。然后,您可以根据需要简单地汇总每个分区

# transform into sample data
sample_data = [dict(zip(base_data.keys(), x)) for x in zip(*base_data.values())]
# and compute statistics the functional way
[sum(x['value'] for x in part if x['state'] == 1)
 for part in partitionby(itemgetter('state'), sample_data)
 if part[0]['state'] == 1]
还有
pandas
方式,类似于@ivallesp所提到的: 您可以通过移动state列来计算状态的变化。那你呢


根据你和你的同龄人最擅长阅读的内容,你可以选择自己的方式。此外,功能方式可能不容易阅读,也可以用可读的循环语句重写。

请查看问题文本中的输入和输出示例,而不是以图片形式提供输入数据,以便我们可以帮助您更好地了解LinkThank@ivallesp。我在问题描述中加入了我的熊猫表的可复制示例。

pd_data = pd.DataFrame(base_data)
pd_data['shifted_state'] = pd_data['state'].shift(fill_value = pd_data['state'][0])
pd_data['cum_state'] = np.cumsum(pd_data['state'] != pd_data['shifted_state'])
pd_data[pd_data['state'] == 1].groupby('cum_state').sum()