我有一个包含产品销售的数据框架和一个显示产品所属类别的列。有些产品属于多个类别。从这个数据框架中,我想创建一个可以加载到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
categories
上pandas.Series.str.split
后用pandas.DataFrame.explode
,pandas.DataFrame.assign
后用df
,pandas.DataFrame.groupby
on['Categories', 'Country']
,groupby.sum
the groups,pandas.DataFrame.unstack
与fill_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
如果我理解正确,你可以拆分你的值,并使用melt
和groupby
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