我很难找到一种简单的方法从整个市场中获得产品的市场份额。例如,我的dataframe如下所示:
例如,我有如下所示的数据格式。假设积A,B和C分别属于1,D,E,F分别属于2,3,4。我想要找到的是,对于每一个独特的季度(即1/6/2020是2020年的第2季度),A、B和C在整个市场中的市场份额是多少。例如,如果我们想在2020年第二季度获得A、B和C(美国市场)的市场份额,那么我们需要将100+200+300除以100+200+300+400+500+600,即600/2100 = 28.57%
我不知道什么是正确的方法来接近它,到目前为止,我必须将整个数据帧转换成一个2d列表,并尝试使用for循环。我希望有一个更整洁和更清洁的方法来解决这个问题。
Product Date Value
0 A 1/6/2020 100
1 B 1/6/2020 200
2 C 1/6/2020 300
3 D 1/6/2020 400
4 E 1/6/2020 500
5 F 1/6/2020 600
6 A 1/9/2020 600
7 B 1/9/2020 500
8 C 1/9/2020 400
9 D 1/9/2020 300
10 E 1/9/2020 200
11 F 1/9/2020 100发布于 2020-11-07 15:43:16
你在正确的轨道上考虑groupby!
你的数据需要有你提到的尺寸--市场和季度。此外,您可能希望您的日期列是一个datetime64。
下面是一个代码块,它构造了一个与当前类似的数据块:
import pandas as pd
df = pd.DataFrame()
df["Product"] = ["A", "B", "C", "D", "E", "F"] * 2
df["Date"] = ["1/6/2020"] * 6 + ["1/9/2020"] * 6
df["Date"] = df["Date"].astype("datetime64[ns]")
df["Value"] = [100, 200, 300, 400, 500, 600] * 2您可能想要添加一个" market“列,可能需要定义一个从产品到市场的映射,然后将它添加到您的dataframe中。类似地,您可以计算每个条目的季度(尽管在您的示例中,您似乎想将date对象视为季度)。
products_to_markets = {
"A": "USA", "B": "USA", "C": "USA",
"D": "Canada", "E": "Canada", "F": "Canada"
}
df["Market"] = df["Product"].map(products_to_markets)
df["Quarter"] = df["Date"].dt.to_period("Q")现在,您可以开始执行您感兴趣的其他一些计算。例如,您可以看到每个季度每个市场的总价值:
df.groupby(["Quarter", "Market"]).sum()我想你要找的是这样的东西:
value_per_quarter = df.groupby("Quarter").sum()
df.groupby(["Quarter", "Market"]).sum() / value_per_quarter产生的结果:
Value
Quarter Market
2020Q1 Canada 0.714286
USA 0.285714发布于 2020-11-07 15:59:27
首先,您必须创建一个dataframe,将您的产品映射到您的市场。
然后使用pd.crosstab()获得一个漂亮的支点表,其中包含参数normalize=index,给出了每行百分比。
import pandas as pd
from io import StringIO
text = """
Product Date Value
0 A 1/6/2020 100
1 B 1/6/2020 200
2 C 1/6/2020 300
3 D 1/6/2020 400
4 E 1/6/2020 500
5 F 1/6/2020 600
6 A 1/9/2020 600
7 B 1/9/2020 500
8 C 1/9/2020 400
9 D 1/9/2020 300
10 E 1/9/2020 200
11 F 1/9/2020 100
"""
# create sample dataframe
df = pd.read_csv(StringIO(text), header=0, sep='\s+')
# create translation of products to markets
market_df = pd.DataFrame([
['A', 1], ['B', 1], ['C', 1],
['D', 2], ['E', 3], ['F', 4]],
columns=['Product', 'Market'],
)
# merge to get products mapped to markets
merged_df = pd.merge(
df,
market_df,
how='left',
on='Product',
)
# crosstab calculates totals per market and date
# normalize='index' calculates percentages over rows
pd.crosstab(
merged_df['Date'],
merged_df['Market'],
merged_df['Value'],
aggfunc='sum',
normalize='index',
)由此产生的数据文件:
Market
Date 1 2 3 4
1/6/2020 0.285714 0.190476 0.238095 0.285714
1/9/2020 0.714286 0.142857 0.095238 0.047619https://stackoverflow.com/questions/64729140
复制相似问题