Python、Pandas:标记自上而下的行占总销量的 80%
Python, Pandas: mark top down rows making 80 percent of total sell
我有 table 产品及其以美元计算的销售金额。我有总销量,想知道哪些产品占总销量的 80%,并在标签栏中将它们标记为 1。请务必按照从大到小的顺序标记 1。低于总销量的是 32,其中 80% 是 25.6。因此,如果我们添加第 2、4、5 和 7 行,从 sold$ 列中的最大数字到最小数字,它将是 26,这使得总销售的 80% 为 32,并将它们标记为 1,其他标记为 0。我想用 python 和 pandas 来完成。先感谢您。
最好的祝福
计算每个产品的销售额分数,按分数排序,计算它们的累计总和并以此得到前 80%
cumsum = (df["sold"]/df["sold"].sum()).sort_values().cumsum()
df["label"] = pd.Series(0, index=cumsum.index).where(cumsum <= 0.2, 1)
你可以这样做:
import pandas as pd
import numpy as np
data = {'productID':[1,2,3,4,5,6,7],'sold$':[2,4,3,8,5,1,9]}
df=pd.DataFrame(data)
df.sort_values('sold$',inplace=True)
df['Label']=np.where(df['sold$'].cumsum()<=df['sold$'].sum() * 0.2,0,1)
df.sort_index(inplace=True)
print (df)
结果:
productID sold$ Label
0 1 2 0
1 2 4 1
2 3 3 0
3 4 8 1
4 5 5 1
5 6 1 0
6 7 9 1
我有 table 产品及其以美元计算的销售金额。我有总销量,想知道哪些产品占总销量的 80%,并在标签栏中将它们标记为 1。请务必按照从大到小的顺序标记 1。低于总销量的是 32,其中 80% 是 25.6。因此,如果我们添加第 2、4、5 和 7 行,从 sold$ 列中的最大数字到最小数字,它将是 26,这使得总销售的 80% 为 32,并将它们标记为 1,其他标记为 0。我想用 python 和 pandas 来完成。先感谢您。
最好的祝福
计算每个产品的销售额分数,按分数排序,计算它们的累计总和并以此得到前 80%
cumsum = (df["sold"]/df["sold"].sum()).sort_values().cumsum()
df["label"] = pd.Series(0, index=cumsum.index).where(cumsum <= 0.2, 1)
你可以这样做:
import pandas as pd
import numpy as np
data = {'productID':[1,2,3,4,5,6,7],'sold$':[2,4,3,8,5,1,9]}
df=pd.DataFrame(data)
df.sort_values('sold$',inplace=True)
df['Label']=np.where(df['sold$'].cumsum()<=df['sold$'].sum() * 0.2,0,1)
df.sort_index(inplace=True)
print (df)
结果:
productID sold$ Label
0 1 2 0
1 2 4 1
2 3 3 0
3 4 8 1
4 5 5 1
5 6 1 0
6 7 9 1