簡體   English   中英

Pandas 等效於 Excel Sumifs

[英]Pandas Equivalent of Excel Sumifs

我有一個 dataframe 是一個單位表,其中包含各自的開始日期、類型和容量。

我創建了第二個 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")

容量表

單元 開始日期 類型 容量
一個 2021 年 1 月 1 日 標准 10
01/03/2021 標准 10
C 2021 年 1 月 4 日 標准 10
D 2021 年 1 月 5 日 異國情調 15
2021 年 1 月 7 日 異國情調 15
F 2021 年 1 月 9 日 異國情調 15
G 2021 年 1 月 10 日 異國情調 15

時間序列

日期 標准帽 異國情調的帽子
2021 年 1 月 1 日 10 0
2021 年 1 月 2 日 10 0
01/03/2021 20 0
2021 年 1 月 4 日 30 0
2021 年 1 月 5 日 30 15
2021 年 1 月 6 日 30 15
2021 年 1 月 7 日 30 35
2021 年 1 月 8 日 30 30
2021 年 1 月 9 日 30 45
2021 年 1 月 10 日 30 60

您可以將pivot放入所需的Time Series布局中,取cumsum ,然后使用asfreq('D')重新采樣為每日時間索引:

df = (df.pivot_table(index='Start Date', columns='Type', values='Capacity')
        .cumsum()
        .asfreq('D').ffill().fillna(0))
開始日期 異國情調 標准
2021-01-01 0.0 10.0
2021-01-02 0.0 10.0
2021-01-03 0.0 20.0
2021-01-04 0.0 30.0
2021-01-05 15.0 30.0
2021-01-06 15.0 30.0
2021-01-07 30.0 30.0
2021-01-08 30.0 30.0
2021-01-09 45.0 30.0
2021-01-10 60.0 30.0

最小的可重現示例:

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)

從容量表開始:

在此處輸入圖像描述

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()

在此處輸入圖像描述

還可以通過以下方式刪除 Standard 和 Exotic Cap 列:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM