【问题标题】:Replicate rows in Pandas and add a new (month) column在 Pandas 中复制行并添加一个新的(月)列
【发布时间】:2020-10-15 16:39:28
【问题描述】:

我正在努力解决我确信是一个简单的问题。我有一个数据框,它的 1000 rows 是独一无二的。

这会按位置按类别显示expenses for the year。每个都有相同的类别组。

我想为每个站点的每项费用创建一个monthly budget 列。

我还想创建一个年初至今的预算列,该列将当年的总预算除以 12 以得出每月的数字。然后将其乘以月份(4 月 = 第 1 个月),得出年初至今的值 - 例如,5 月将是每月数字 * 2 等。

我正在尝试使用 pandas 来执行此操作。我试过了

    pd.DataFrame(np.repeat(budget.values,12,axis=0)) #replicate each row by 12

然后我的计划是遍历每个组中的每一行以添加月份,但我正在努力实现任何目标。

任何帮助将不胜感激。

(抱歉我无法正确粘贴表格 - 请看图片)

当前

+------------+-------------+--------+
|  Location  |  Expense    | Amount |
+------------+-------------+--------+
| Sheffield  | Electricity |  10000 |
| Sheffield  | Gas         |  12000 |
| Manchester | Electricity |  15000 |
| Manchester | Electricity |  13000 |
+------------+-------------+--------+

想要的

+------------+-------------+--------+--------+---------+-------+
|  Location  |  Expense    | Amount | Budget |  Month  |  YTD  |
+------------+-------------+--------+--------+---------+-------+
| Sheffield  | Electricity |  10000 |  10000 | April   |  1000 |
| Sheffield  | Electricity |  10000 |  10000 | May     |  2000 |
| Sheffield  | Electricity |  10000 |  10000 | June    |  3000 |
| Sheffield  | Electricity |  10000 |  10000 | July    |  4000 |
| Sheffield  | Electricity |  10000 |  10000 | August  |  5000 |
| Sheffield  | Electricity |  10000 |  10000 | Sep     |  6000 |
| Sheffield  | Electricity |  10000 |  10000 | Oct     |  7000 |
| Sheffield  | Electricity |  10000 |  10000 | Dec     |  8000 |
| Sheffield  | Electricity |  10000 |  10000 | Jan     |  9000 |
| Sheffield  | Electricity |  10000 |  10000 | Feb     | 10000 |
| Sheffield  | Electricity |  10000 |  10000 | March   | 11000 |
| Sheffield  | Gas         |  12000 |  20000 | April   |  2000 |
| Sheffield  | Gas         |  12000 |  20000 | May     |  4000 |
| Sheffield  | Gas         |  12000 |  20000 | June... |  6000 |
| Sheffield  | Gas         |  12000 |  20000 | ..March |  8000 |
| Manchester | Electricity |  15000 |  36000 | April   |  4000 |
| Manchester | Electricity |  15000 |  36000 | May     |  8000 |
+------------+-------------+--------+--------+---------+-------+

   

【问题讨论】:

  • 请在文本表单中添加一些示例数据。
  • YTD 列的计算逻辑是什么?
  • @Grayrigel - 抱歉 - 我现在已使用文本形式重新发布
  • @Manakin - 年初至今由预算/12 计算,然后将其乘以月份列中的日历年。它本质上是将年度预算(预算列)划分为每月金额,然后在一年中累积 - 例如4 月年初至今 = 1*(预算/12),5 月年初至今 = 2*(预算/12),6 月年初至今 = 3*(预算/12)。 4 月是第 1 个月,因为这是财政年度的开始。非常感谢

标签: python pandas dataframe group-by


【解决方案1】:

您可以创建您的特定月份表,将四月作为会计年度开始月份的数字 1。

import pandas as pd 
  
# intialise data from list. 
data = {'Month':['April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January', 'February', 'March'], \
        'Number':range(1,13), \
        'key': [1] * 12 }

  
# Create DataFrame 
df_months = pd.DataFrame(data)

生成这样的表格:

+------------+--------+-----+
| Month      | Number | key |
+------------+--------+-----+
| April      |  1     | 1   |
| May        |  2     | 1   |
| June       |  3     | 1   |
| July       |  4     | 1   |
| August     |  5     | 1   |
| September  |  6     | 1   |
| October    |  7     | 1   |
| November   |  8     | 1   |
| December   |  9     | 1   |
| January    |  10    | 1   |
| February   |  11    | 1   |
| March      |  12    | 1   |
+------------+--------+-----+

现在调整您的第二张表,我们称之为 df_amounts 以拥有一个虚构的键列 (key),这将确保每个月都与每个位置/费用组合相连接:

df_amounts['key'] = 1

df_amounts:

+------------+-------------+--------+-----+
|  Location  |  Expense    | Amount | key |
+------------+-------------+--------+-----+
| Sheffield  | Electricity |  10000 | 1   |
| Sheffield  | Gas         |  12000 | 1   |
| Manchester | Electricity |  15000 | 1   |
| Manchester | Electricity |  13000 | 1   |
+------------+-------------+--------+-----+

然后加入key上的表格:

df = pd.merge(df_amounts, df_months, on="key", how="left")

获取下表:

+------------+-------------+--------+-----+-------+--------+
|  Location  |  Expense    | Amount | key | Month | Number | 
+------------+-------------+--------+-----+-------+--------+

现在将number 列除以12,然后将值与Amount 相乘,得到新列YTD

df['YTD']= df['Amount'] * (df['Number'] / 12)

您每月的Budget 专栏的工作方式类似:

df['Budget']= df['Amount'] / 12

【讨论】:

    猜你喜欢
    • 2023-03-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    相关资源
    最近更新 更多