Pandas 基于列 header 的数据框求和行
Pandas Dataframe sum row based on column header
我有以下数据框,想创建两列,一列显示 MTD 金额,另一列显示基于每个帐户名称的日期参数的累计 YTD。这在 Excel 中使用 =SUMIFS 公式很容易实现,并且想知道 Python 等价物。
+---------------+------------+------------+------------+------------+
| Account Names | 31/01/2022 | 28/02/2022 | 31/03/2022 | 30/04/2022 |
+---------------+------------+------------+------------+------------+
| Cash At Bank | 100 | 150 | 100 | 150 |
| Debtors | 50 | 50 | 50 | 100 |
| Inventory | 250 | 250 | 350 | 100 |
| PAYG Withheld | 50 | 50 | 10 | 150 |
+---------------+------------+------------+------------+------------+
理想情况下,我希望它尽可能高效,即不需要循环。我尝试使用 np.select 来尝试这样做,因为我读过这是最快的方法之一,但没有运气。我收到以下错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape
EndDate = '31/03/2022'
Budget_Assets["MTD_Amount"] = np.select(condlist=[Budget_Assets.columns == EndDate],choicelist=[Budget_Assets[EndDate]],default=0)
例如,银行现金的 MTD_Amount 列中的值应为 100,YTD_Column 将为 350(从“31/01/2022”到“31”的数字总和/03/2022')
您可以尝试 sum(axis=1)
将日期时间像列一样切片以计算 YTD
并仅使用 loc
得到 MTD
EndDate = '31/03/2022'
date_cols = df.filter(regex='\d{2}/\d{2}/\d{4}')
date_cols.columns = pd.to_datetime(date_cols.columns, dayfirst=True)
df['YTD_Column'] = date_cols.loc[:, :pd.to_datetime(EndDate, dayfirst=True)].sum(axis=1)
df['MTD_Column'] = df[EndDate]
Account Names 31/01/2022 28/02/2022 31/03/2022 30/04/2022 YTD_Column MTD_Column
0 Cash At Bank 100 150 100 150 350 100
1 Debtors 50 50 50 100 150 50
2 Inventory 250 250 350 100 850 350
3 PAYG Withheld 50 50 10 150 110 10
我有以下数据框,想创建两列,一列显示 MTD 金额,另一列显示基于每个帐户名称的日期参数的累计 YTD。这在 Excel 中使用 =SUMIFS 公式很容易实现,并且想知道 Python 等价物。
+---------------+------------+------------+------------+------------+
| Account Names | 31/01/2022 | 28/02/2022 | 31/03/2022 | 30/04/2022 |
+---------------+------------+------------+------------+------------+
| Cash At Bank | 100 | 150 | 100 | 150 |
| Debtors | 50 | 50 | 50 | 100 |
| Inventory | 250 | 250 | 350 | 100 |
| PAYG Withheld | 50 | 50 | 10 | 150 |
+---------------+------------+------------+------------+------------+
理想情况下,我希望它尽可能高效,即不需要循环。我尝试使用 np.select 来尝试这样做,因为我读过这是最快的方法之一,但没有运气。我收到以下错误:
ValueError: shape mismatch: objects cannot be broadcast to a single shape
EndDate = '31/03/2022'
Budget_Assets["MTD_Amount"] = np.select(condlist=[Budget_Assets.columns == EndDate],choicelist=[Budget_Assets[EndDate]],default=0)
例如,银行现金的 MTD_Amount 列中的值应为 100,YTD_Column 将为 350(从“31/01/2022”到“31”的数字总和/03/2022')
您可以尝试 sum(axis=1)
将日期时间像列一样切片以计算 YTD
并仅使用 loc
得到 MTD
EndDate = '31/03/2022'
date_cols = df.filter(regex='\d{2}/\d{2}/\d{4}')
date_cols.columns = pd.to_datetime(date_cols.columns, dayfirst=True)
df['YTD_Column'] = date_cols.loc[:, :pd.to_datetime(EndDate, dayfirst=True)].sum(axis=1)
df['MTD_Column'] = df[EndDate]
Account Names 31/01/2022 28/02/2022 31/03/2022 30/04/2022 YTD_Column MTD_Column
0 Cash At Bank 100 150 100 150 350 100
1 Debtors 50 50 50 100 150 50
2 Inventory 250 250 350 100 850 350
3 PAYG Withheld 50 50 10 150 110 10