相当于Excel Sumifs的Pandas

2024-06-09 22:33:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个dataframe,它是一个单元表,包含各自的开始日期、类型和容量

我已经创建了第二个数据帧,它是一个单位累积容量的时间序列,有两列类型,标准和外来

我在使用python计算时间序列表中按日期划分的标准列和外来列的累积容量时遇到了问题。实现这一目标的最佳方式是什么

在excel中,我将根据机组开始日期和机组类型为每种容量类型使用sumifs创建时间序列表

=sumifs(capacity table['capacity' range], capacity table['start date' range],"<=" time series['date'],capacity table['type' range],"Standard")

=sumifs(capacity table['capacity' range], capacity table['start date' range],"<=" time series['date'],capacity table['type' range],"Exotic")

容量表

^{tb1}$

时间序列

^{tb2}$

Tags: 类型标准datetime时间tablerange序列
2条回答

您可以^{}进入所需的Time Series布局,使用^{},然后使用^{}重新采样到每日时间索引中:

df = (df.pivot_table(index='Start Date', columns='Type', values='Capacity')
        .cumsum()
        .asfreq('D').ffill().fillna(0))
^{tb1}$

最小可复制示例:

import pandas as pd
import numpy as np
df = pd.DataFrame({
    'Start Date': ['01/01/2021', '01/03/2021', '01-04-2021', '01/05/2021', '01/07/2021', '01/09/2021', '01/10/2021'],
    'Type': ['Standard']*3 + ['Exotic']*4,
    'Capacity': [10]*3 + [15]*4,
}).set_index('Start Date')
df.index = pd.to_datetime(df.index)
df = df.pivot_table(index='Start Date', columns='Type', values='Cumulative').cumsum()
df = df.asfreq('D').ffill().fillna(0)

从容量表开始:

enter image description here

df['Start Date'] = pd.to_datetime(df['Start Date'])

df['Standard Cap'] = df.apply(lambda row: row['Capacity'] if row['Type'] == 'Standard' else 0,
    axis=1)
df['Exotic Cap'] = df.apply(lambda row: row['Capacity'] if row['Type'] == 'Exotic' else 0,
    axis=1)

df1 = pd.DataFrame({'Date':pd.date_range(start=df.iloc[0,1], end=df.iloc[-1,1])})

df1 = df1.merge(df, how = 'left', left_on = 'Date', right_on = 'Start Date')

df1.drop(['Unit', 'Start Date', 'Type', 'Capacity'], inplace = True, axis=1)

df1.fillna(0, inplace = True)

df1['S_Cap_Cumulative'] = df1['Standard Cap'].cumsum()
df1['E_Cap_Cumulative'] = df1['Exotic Cap'].cumsum()

enter image description here

也可以通过以下方式删除标准和特殊的Cap列:

df1.drop(['Standard Cap', 'Exotic Cap'], inplace = True, axis=1)

相关问题 更多 >