如何使用熊猫根据条件创建一个总和为新的行?
初始表格-
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
你能帮我吗?
答案 0 :(得分:2)
对于如上所述创建DataFrame,我们需要应用两个操作。
字符串 .replace
.groupby 进行汇总,即 .sum()和 .reset_index()
字符串替换方法用于替换字符串中的字符,由此我们可以将字符串转换为F31,F32到F3。
.replace('F31','F3')
.replace('F32','F3')
.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'))
数据在应用上述操作之前。
数据经过上述操作后。
答案 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()
。