我在pyspark中有一个csv文件,里面有大量的销售信息--单位、店铺id、总销售额、客户忠诚度、产品编号等。
我需要将忠诚度计划中的客户的销售数量与不在忠诚度计划中的客户的销售数量进行比较。忠诚度计划中的所有客户在"collector_key“字段中用正整数表示,而不是用负整数表示,如下所示:
>>> df.head(10)
collector_key sales
0 -1 42.72
1 -1 27.57
2 139517343969 62.44
3 -1 0.00
4 -1 0.00
5 -1 7.32
6 -1 64.51
7 -1 0.00
8 134466064080 20.72
9 -1 0.00起初,我想也许我可以使用if/else语句将用户划分为忠诚度列表和非忠诚度列表。但后来我想,将忠诚的客户过滤到他们自己的数据框中,并对非忠诚的客户执行同样的操作,然后将两个结果相减,可能会更有效。我想也许我可以在"collector_key“专栏上做一个正则表达式:
non_loy_cust = test_1.filter(regex='^(-?\d+)\s+')但是我不确定如何保留"sales“列,因为"regex”和"items“是相互排斥的。
最重要的是,我将需要总结销售列,以便我有一个忠诚度和非忠诚度客户的单一数字,但我认为(一旦我克服了前面的障碍)可以这样做:
loy_sales = df.groupby('sales').max()
non_loy_sales = df2.groupby('sales').max()或者甚至还有一个我忽略的更简单的第三种选择?
发布于 2018-03-02 01:53:22
我想你是在找.transform()
# set group first
df['collector_key'] = df['collector_key'].map(lambda x: 0 if x == -1 else 1)
#loyalty (1) vs non-loyalty sales(0)
df.groupby('collector_key')['sales'].sum()
collector_key
0 142.12
1 83.16
# adding max sales column
df['max_sales'] = df.groupby('collector_key')['sales'].transform('max')
collector_key sales max_sales
0 -1 42.72 64.51
1 -1 27.57 64.51
2 139517343969 62.44 62.44
3 -1 0.00 64.51
4 -1 0.00 64.51
5 -1 7.32 64.51https://stackoverflow.com/questions/49055480
复制相似问题