对包含多个类别的数据框架列求和



我有一个包含产品销售的数据框架和一个显示产品所属类别的列。有些产品属于多个类别。从这个数据框架中,我想创建一个可以加载到tableau的新数据框架,它将对每个类别的销售额求和。

颇dataframe

Country Sales   Product Categories
A   800 Q   z,y
A   300 W   z
B   400 E   z
B   100 R   x
B   200 T   x,y

所需dataframe:

Categories  Country Sales
z   A    1,100 
x   A    -   
y   A    800 
z   B   400
x   B   300
y   B   200
  • categoriespandas.Series.str.split后用pandas.DataFrame.explode,pandas.DataFrame.assign后用df
  • pandas.DataFrame.groupbyon['Categories', 'Country'],groupby.sumthe groups,
  • pandas.DataFrame.unstackfill_value='-',pandas.DataFrame.stack,最后pandas.DataFrame.reset_index:
>>> (df.assign(Categories=df.Categories.str.split(','))
.explode('Categories')
.groupby(['Categories', 'Country'], sort=False)
.sum().unstack(-1, fill_value='-')
.stack().reset_index())
Categories Country Sales
0          z       A  1100
1          z       B   400
2          y       A   800
3          y       B   200
4          x       A     -
5          x       B   300

如果我理解正确,你可以拆分你的值,并使用meltgroupby

df1 = df.join(
df["Categories"].str.split(",", expand=True).drop("Categories", 1)

new_df = pd.melt(df1, 
id_vars=["Country", "Product", "Sales"], value_name="Categories")
.groupby(["Categories", "Country"]
)["Sales"].sum()
Categories  Country
x           B           300
y           A           800
B           200
z           A          1100
B           400

另一种方法是使用explode

df.assign(Categories=df['Categories'].str.split(',')).explode('Categories')
.groupby(
["Categories", "Country"]
)["Sales"].sum()

Categories  Country
x           B           300
y           A           800
B           200
z           A          1100
B           400

最新更新