选择一列的子集,然后与另一列进行比较

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

以上是关于选择一列的子集,然后与另一列进行比较的主要内容,如果未能解决你的问题,请参考以下文章

pyspark 将列值与另一列进行比较包含值范围

使用 DB2,您如何为一列选择具有 MAX 的行,然后在同一张表的另一列的结果子集中选择具有 MAX 的行?

根据与另一列的部分匹配创建新列

对于每个类别,如何找到与另一列的最小值对应的列的值?

Pandas Multiindex Groupby 聚合列与另一列的值

SQL LEFT JOIN 与另一列的 where 子句