Python 如何计算每个客户销售商品的频率?

Python 如何计算每个客户销售商品的频率?,python,frequency,Python,Frequency,我试图计算数据集中每个客户的商品销售频率,但我不想计算整个数据集长度的频率,而是计算每个客户购买商品的总数 我的数据框将如下所示: data = {'ClientId': ['1','2','3','4','2','2','1','4'], 'QuantitySold': ['5','10','6','7','5','10','8','7'] } 预期产出: Client Id QuantitySold FrequencySold 1

我试图计算数据集中每个客户的商品销售频率,但我不想计算整个数据集长度的频率,而是计算每个客户购买商品的总数

我的数据框将如下所示:

data = {'ClientId': ['1','2','3','4','2','2','1','4'],
        'QuantitySold': ['5','10','6','7','5','10','8','7']
       }
预期产出:

Client Id     QuantitySold     FrequencySold
1             5                0.385
2             10               0.4
3             6                1
4             7                0.5
2             5                0.2
2             10               0.4
1             8                0.615
4             7                0.5
解释计算:客户1=5/(5+8)=0.385


如何使用Python实现这一点?

首先,创建一个包含每个客户端总数的字典,然后将当前数量除以这些总数:

import collections
totals = collections.defaultdict(int)
for c, q in zip(data["ClientId"], data["QuantitySold"]):
    totals[c] += int(q)
# defaultdict(int, {'1': 13, '2': 25, '3': 6, '4': 14})

for c, q in zip(data["ClientId"], data["QuantitySold"]):
    print(c, q, int(q)/totals[c])
输出:

1 5 0.38461538461538464
2 10 0.4
3 6 1.0
4 7 0.5
2 5 0.2
2 10 0.4
1 8 0.6153846153846154
4 7 0.5

首先,创建一个包含每个客户机总计的字典,然后将当前数量除以这些总计:

import collections
totals = collections.defaultdict(int)
for c, q in zip(data["ClientId"], data["QuantitySold"]):
    totals[c] += int(q)
# defaultdict(int, {'1': 13, '2': 25, '3': 6, '4': 14})

for c, q in zip(data["ClientId"], data["QuantitySold"]):
    print(c, q, int(q)/totals[c])
输出:

1 5 0.38461538461538464
2 10 0.4
3 6 1.0
4 7 0.5
2 5 0.2
2 10 0.4
1 8 0.6153846153846154
4 7 0.5

使用
熊猫

获取总数并将其转换为dict:

summed = df.groupby('ClientId').sum('QuantitySold')
sums = summed.to_dict()['QuantitySold']
要计算每行的频率,请执行以下操作:

def get_freqs(row):
    return row[1] / sums[row[0]]
适用于每一行:

df['FrequencySold'] = df.apply(get_freqs, axis=1)

使用
熊猫

获取总数并将其转换为dict:

summed = df.groupby('ClientId').sum('QuantitySold')
sums = summed.to_dict()['QuantitySold']
要计算每行的频率,请执行以下操作:

def get_freqs(row):
    return row[1] / sums[row[0]]
适用于每一行:

df['FrequencySold'] = df.apply(get_freqs, axis=1)

虽然这段代码可能会回答这个问题,但提供关于为什么和/或如何回答这个问题的附加上下文可以提高其长期价值。嗨,@donald duck,我只是希望它很清楚,但你是对的。我可以补充一下:代码的第一行使用transfrom方法创建了一个新的列“total sales”,我认为groupby更容易理解。第二行在现有数据框中再添加一列“频率”,并使用简单的除法运算符计算频率。。Ps:很抱歉,我仍然很难格式化这么多评论@​everyt4u你应该将其编辑到你的答案中,但没关系,我将你的评论复制到了你的答案中。事实上,这对我的问题不起作用,因为“总销售额”是针对整个数据集的,而我试图用每个客户Id的“总销售额”除以“QuantitySeld”@DonaldDuck谢谢,感谢..我还添加了输出。这里仍然是新的..虽然这段代码可能会回答这个问题,但提供了关于为什么和/或如何回答这个问题的附加上下文,提高了它的长期价值。嗨,@donald duck,我只是希望它很清楚,但你是对的。我可以补充一下:代码的第一行使用transfrom方法创建了一个新的列“total sales”,我认为groupby更容易理解。第二行在现有数据框中再添加一列“频率”,并使用简单的除法运算符计算频率。。Ps:很抱歉,我仍然很难格式化这么多评论@​everyt4u你应该将其编辑到你的答案中,但没关系,我将你的评论复制到了你的答案中。事实上,这对我的问题不起作用,因为“总销售额”是针对整个数据集的,而我试图用每个客户Id的“总销售额”除以“QuantitySeld”@DonaldDuck谢谢,非常感谢。我还添加了输出。这里仍然是新的。谢谢,您的解决方案似乎有效。但是,我不知道如何将频率列从循环中添加到我的数据集谢谢,您的解决方案似乎有效。但是,我不知道如何从循环中将频率列添加到我的数据集中