【问题标题】:How to calculate QTD values from different columns based on months in a pandas dataframe?如何根据熊猫数据框中的月份计算不同列的 QTD 值?
【发布时间】:2022-10-13 18:02:04
【问题描述】:

我想根据熊猫数据框中的月份计算不同列的 QTD 值。

代码:

data = {'month': ['April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'January', 'February', 'March'],
    'kpi': ['sales', 'sales quantity', 'sales', 'sales', 'sales', 'sales', 'sales', 'sales quantity', 'sales', 'sales', 'sales', 'sales'],
    're': [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12],
    're3+9': [10, 20, 30, 40, 50, 60, 70, 80, 90, 10, 10, 20],
    're6+6': [5, 10, 15, 20, 25, 30, 35, 40, 45, 50, 55, 60],
    're9+3': [2, 4, 6, 8, 10, 12, 14, 16, 20, 10, 10, 20],
    're_o' : [1, 1, 1, 11, 11, 11, 12, 12, 12, 13, 13, 13]
    }

# Create DataFrame
df = pd.DataFrame(data)
g = pd.to_datetime(df['month'], format='%B').dt.to_period('Q')

if (df['month'].isin(['April', 'May', 'June'])):
        df['Q-Total'] = df.groupby([g,'kpi'])['re'].cumsum()
elif (df['month'].isin(['July', 'August', 'September'])):
        df['Q-Total'] = df.groupby([g, 'kpi'])['re3+9'].cumsum()
elif (df['month'].isin(['October', 'November', 'December'])):
        df['Q-Total'] = df.groupby([g, 'kpi'])['re6+6'].cumsum()
elif (df['month'].isin(['January', 'February', 'March'])):
        df['Q-Total'] = df.groupby([g, 'kpi'])['re9+3'].cumsum()
else:
        print("zero")

我需要的输出如下:

       month             kpi   re re3+9 re6+6 re9+3  re_o  Q-Total
0       April           sales   1   10    5     2      1        1
1         May  sales quantity   2   20   10     4      1        2
2        June           sales   3   30   15     6      1        4
3        July           sales   4   40   20     8     11       40
4      August           sales   5   50   25    10     11       90
5   September           sales   6   60   30    12     11      150
6     October           sales   7   70   35    14     12       35
7    November  sales quantity   8   80   40    16     12       40
8    December           sales   9   90   45    20     12       80
9     January           sales  10   10   50    10     13       10
10   February           sales  11   10   55    10     13       20
11      March           sales  12   20   60    20     13       40

这里有四列名为 re,re3+9,re6+6,re9+3 用于获取累积和值。我想根据以下条件计算累积和:

  1. 如果月份是 4 月、5 月和 6 月,则仅从列 re 中获取累积总和
  2. 如果月份是 7 月、8 月和 9 月,则仅从 re3+9 中取累计和
  3. 如果月份是 10 月、11 月和 12 月,则仅从 re6+6 中取累计和
  4. 如果月份是一月、二月和三月,则只取re9+3的累计和

    但是当我运行代码时出现如下错误:

    Traceback (most recent call last):
    File "/home/a/p/s.py", line 54, in <module>
    if (df['month'].isin(['April', 'May', 'June'])):
    File "/home/a/anaconda3/envs/p/lib/python3.9/site-packages/pandas/core/generic.py", line 1527, in __nonzero__
    raise ValueError(
    ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().
    

    任何人都可以提出解决此问题的解决方案吗?

【问题讨论】:

    标签: python-3.x pandas dataframe


    【解决方案1】:

    利用:

    g = pd.to_datetime(df['month'], format='%B').dt.to_period('Q')
    
    m1 = df['month'].isin(['April', 'May', 'June'])
    m2 = df['month'].isin(['July', 'August', 'September'])
    m3 = df['month'].isin(['October', 'November', 'December'])
    m4 = df['month'].isin(['January', 'February', 'March'])
    
    
    df['Q-Total'] = np.select([m1, m2, m3, m4], 
                              [df['re'], df['re3+9'], df['re6+6'], df['re9+3']], default=0)
    
    df['Q-Total'] = df.groupby([g,'kpi'])['Q-Total'].cumsum()
    print (df)
            month             kpi  re  re3+9  re6+6  re9+3  re_o  Q-Total
    0       April           sales   1     10      5      2     1        1
    1         May  sales quantity   2     20     10      4     1        2
    2        June           sales   3     30     15      6     1        4
    3        July           sales   4     40     20      8    11       40
    4      August           sales   5     50     25     10    11       90
    5   September           sales   6     60     30     12    11      150
    6     October           sales   7     70     35     14    12       35
    7    November  sales quantity   8     80     40     16    12       40
    8    December           sales   9     90     45     20    12       80
    9     January           sales  10     10     50     10    13       10
    10   February           sales  11     10     55     10    13       20
    11      March           sales  12     20     60     20    13       40
    

    【讨论】:

      【解决方案2】:

      您可以使用:

      quarters = {1: 're9+3', 2: 're', 3: 're3+9', 4: 're6+6'}
      
      col = pd.to_datetime(df['month'], format='%B').dt.quarter.map(quarters)
      
      idx, cols = pd.factorize(col)
      
      df['Q-total'] = (
           pd.Series(df.reindex(cols, axis=1).to_numpy()[np.arange(len(df)), idx],
                     index=df.index)
             .groupby(col).cumsum()
          )
      

      输出:

              month             kpi  re  re3+9  re6+6  re9+3  re_o  Q-total
      0       April           sales   1     10      5      2     1        1
      1         May  sales quantity   2     20     10      4     1        3
      2        June           sales   3     30     15      6     1        6
      3        July           sales   4     40     20      8    11       40
      4      August           sales   5     50     25     10    11       90
      5   September           sales   6     60     30     12    11      150
      6     October           sales   7     70     35     14    12       35
      7    November  sales quantity   8     80     40     16    12       75
      8    December           sales   9     90     45     20    12      120
      9     January           sales  10     10     50     10    13       10
      10   February           sales  11     10     55     10    13       20
      11      March           sales  12     20     60     20    13       40
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2019-08-19
        • 2017-09-26
        • 2015-08-09
        • 2020-01-11
        • 2023-01-10
        • 1970-01-01
        • 1970-01-01
        • 2015-01-28
        相关资源
        最近更新 更多