[英]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.