如何根据列中的条件进行计算?
How can I do a calculation depending on a condition in a column?
当有一组连续跟随的时候,我想做一个计算。
我有一个关于压缩机工作原理的数据库。如果是 ON/OFF 和此刻消耗的电量,我会每 5 分钟获取一次压缩机状态。 On_Off
列有一个 1
当压缩机工作时(ON)和 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
我想做的是有一套的时候才加电,再做一套Data.Frame
。例如:
在这个例子中,第一次打开压缩机是在 00:20 -00:30 之间。期间消耗了25(10+10+5)。第二次它在 (00:50-01:15) 持续更长时间,并在此间隔 50 (10+10+10+10+10+5+5) 内消耗。第三次消耗20(10+10).
我想自动执行此操作我是 pandas 的新手,我想不出办法。
我要做的是创建一个代表 activity 的每个周期的变量,并用一个整数作为 ID,然后按它分组并对 Electricity
列求和。创建它的一种简单方法是通过累积求和 On_Off
(数据必须按递增日期排序)并将结果值乘以 On_Off
列。如果您在 Pandas 中提供 table 的可重现示例,我可以快速将解决方案写给您。
希望对您有所帮助
假设您有以下数据:
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
:您只需通过字段partition
您的数据,即该方法按顺序处理数据并在每次值时生成一个新分区领域的变化。然后,您可以根据需要简单地汇总每个分区。
# 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提到的方式:
您可以通过移动状态列来计算状态的变化。那你
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()
根据您和您的同龄人的最佳阅读能力,您可以选择自己的方式。另外,函数式的方式可能不容易阅读,也可以用可读的循环语句重写。
当有一组连续跟随的时候,我想做一个计算。
我有一个关于压缩机工作原理的数据库。如果是 ON/OFF 和此刻消耗的电量,我会每 5 分钟获取一次压缩机状态。 On_Off
列有一个 1
当压缩机工作时(ON)和 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
我想做的是有一套的时候才加电,再做一套Data.Frame
。例如:
在这个例子中,第一次打开压缩机是在 00:20 -00:30 之间。期间消耗了25(10+10+5)。第二次它在 (00:50-01:15) 持续更长时间,并在此间隔 50 (10+10+10+10+10+5+5) 内消耗。第三次消耗20(10+10).
我想自动执行此操作我是 pandas 的新手,我想不出办法。
我要做的是创建一个代表 activity 的每个周期的变量,并用一个整数作为 ID,然后按它分组并对 Electricity
列求和。创建它的一种简单方法是通过累积求和 On_Off
(数据必须按递增日期排序)并将结果值乘以 On_Off
列。如果您在 Pandas 中提供 table 的可重现示例,我可以快速将解决方案写给您。
希望对您有所帮助
假设您有以下数据:
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
:您只需通过字段partition
您的数据,即该方法按顺序处理数据并在每次值时生成一个新分区领域的变化。然后,您可以根据需要简单地汇总每个分区。
# 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提到的方式:
您可以通过移动状态列来计算状态的变化。那你
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()
根据您和您的同龄人的最佳阅读能力,您可以选择自己的方式。另外,函数式的方式可能不容易阅读,也可以用可读的循环语句重写。