在Pandas中使用SUMIF创建新行

2024-10-03 04:36:25 发布

您现在位置: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

你能帮帮我吗


Tags: pandasdatevalueproduct条件aprmaycat
2条回答

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

因此{}>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()

为了创建上面提到的数据帧,我们需要应用两个操作

  1. 字符串。替换

  2. .groupby加总,即.sum().reset\u index()

  3. 字符串替换方法用于替换字符串中的字符,通过该方法可以将字符串即F31、F32转换为F3

    .替换('F31','F3')

    .替换('F32','F3')

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

然后,我们需要根据'CAT'列聚合值之和列,即首先按“产品”分组,然后按“日期”分组,然后按“CAT”分组。因此,我们使用.sum()

这之后的结果将是一个分组对象,但要将其转换为数据帧,我们需要使用.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

相关问题 更多 >