我在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+')
但后来我不确定如何保留“销售”栏目,因为“正则表达式”和“项目”是相互排斥的。
最重要的是,我需要总结销售栏目,以便为忠诚度和非忠诚度客户提供一个号码,但我认为(一旦我克服了之前的障碍),可以使用以下内容:
loy_sales = df.groupby('sales').max()
non_loy_sales = df2.groupby('sales').max()
或者甚至可能有一个更容易的第三种选择,我忽视了?
答案 0 :(得分:1)
我认为您正在寻找.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.51