在熊猫中使用SUMIF创建新行

时间:2020-09-28 15:19:10

标签: python pandas

如何使用熊猫根据条件创建一个总和为新的行?

初始表格-

Product   Date  CAT    Value
Product A Apr   F31    100
Product A Apr   F32    200
Product A Apr   F45    300
Product A Apr   F46    400
Product A May   F31    200
Product A May   F32    300
Product A May   F45    400
Product A May   F46    500
Product B Apr   F31    200
Product B Apr   F32    300
Product B Apr   F45    400
Product B Apr   F46    500
Product B May   F31    600
Product B May   F32    700
Product B May   F45    800
Product B May   F46    900

我想通过将F31和F32组合为F3来创建它,它应该给我总价值。

Product   Date  CAT    Value
Product A Apr   F3     300
Product A Apr   F45    300
Product A Apr   F46    400
Product A May   F3     500
Product A May   F45    400
Product A May   F46    500
Product B Apr   F3     500
Product B Apr   F45    400
Product B Apr   F46    500
Product B May   F3    1300
Product B May   F45    800
Product B May   F46    900

你能帮我吗?

2 个答案:

答案 0 :(得分:2)

对于如上所述创建DataFrame,我们需要应用两个操作。

  1. 字符串 .replace

  2. .groupby 进行汇总,即 .sum() .reset_index()

  3. 字符串替换方法用于替换字符串中的字符,由此我们可以将字符串转换为F31,F32到F3。

    .replace('F31','F3')

    .replace('F32','F3')

  4. .groupby 方法用于基于给定的约束来分离数据。该方法将数据分成可以执行操作的块。在这里,我们需要根据多个列对数据进行分组。

然后,我们需要基于'CAT'列汇总“价值总和”列,即,这些列首先按“产品”分组,然后按“日期”分组,然后按“ CAT”分组。因此,为此,我们使用 .sum()

此后的结果将是一个分组的对象,但是要将其转换为 DataFrame ,我们需要使用 .reset_index(),该方法允许填充列,并根据输入的条件列提供相应的值。

Data.groupby(['Product','Date','CAT'])['Value'].sum().reset_index(name='Value')

代码段如下所示:

Product = ['Product A','Product A','Product A','Product A','Product A','Product A','Product A','Product A','Product B','Product B','Product B','Product B','Product B','Product B','Product B','Product B']

Date = ['Apr','Apr','Apr','Apr','May','May','May','May','Apr','Apr','Apr','Apr','May','May','May','May']

CAT = ['F31','F32','F45','F46','F31','F32','F45','F46','F31','F32','F45','F46','F31','F32','F45','F46']

Value = [100, 200,300,400,200,300,400,500,200,300,400,500,600,700,800,900]

# Creating Data Frame

Data = pd.DataFrame({'Product':Product,'Date':Date,'CAT':CAT,'Value':Value})

# String Replace

Data['CAT'] = Data['CAT'].replace('F31','F3')

Data['CAT'] = Data['CAT'].replace('F32','F3')

# Group By Operation

DataG = pd.DataFrame(Data.groupby(['Product','Date','CAT'])['Value'].sum().reset_index(name='Value'))

数据在应用上述操作之前。

Data Before applying above operations

数据经过上述操作后。

Data After applying above operations

答案 1 :(得分:1)

首先,让目标正则表达式替换只替换后面的数字 CAT A

所以CAT A5-> CAT A

df['CAT'] = df['CAT'].str.replace('(CAT A)(\d+)',r'\1')

然后进行分组。

df.groupby(['Product','Date','CAT'])['Value'].sum()
Product    Date  CAT  
Product A  Apr   CAT A     300
                 CAT B     300
                 CAT C     400
           Jul   CAT C     500
           Jun   CAT B     400
           May   CAT A     500
Product B  Apr   CAT A     500
                 CAT B     400
                 CAT C     500
           May   CAT A    1300
                 CAT B     800
                 CAT C     900
Name: Value, dtype: int64

如果要返回数据框,请添加.reset_index()