选择一列的子集,然后与另一列进行比较
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了选择一列的子集,然后与另一列进行比较相关的知识,希望对你有一定的参考价值。
我在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()
或者甚至有一个更容易的第三种选择我可以忽略?
答案
我想你正在寻找.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
以上是关于选择一列的子集,然后与另一列进行比较的主要内容,如果未能解决你的问题,请参考以下文章
使用 DB2,您如何为一列选择具有 MAX 的行,然后在同一张表的另一列的结果子集中选择具有 MAX 的行?