首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >选择一列的子集,然后与另一列进行比较

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

Stack Overflow用户
提问于 2018-03-02 01:30:14
回答 1查看 168关注 0票数 0

我在pyspark中有一个csv文件,里面有大量的销售信息--单位、店铺id、总销售额、客户忠诚度、产品编号等。

我需要将忠诚度计划中的客户的销售数量与不在忠诚度计划中的客户的销售数量进行比较。忠诚度计划中的所有客户在"collector_key“字段中用正整数表示,而不是用负整数表示,如下所示:

代码语言:javascript
复制
>>> 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“专栏上做一个正则表达式:

代码语言:javascript
复制
non_loy_cust = test_1.filter(regex='^(-?\d+)\s+')

但是我不确定如何保留"sales“列,因为"regex”和"items“是相互排斥的。

最重要的是,我将需要总结销售列,以便我有一个忠诚度和非忠诚度客户的单一数字,但我认为(一旦我克服了前面的障碍)可以这样做:

代码语言:javascript
复制
loy_sales = df.groupby('sales').max()
non_loy_sales = df2.groupby('sales').max()

或者甚至还有一个我忽略的更简单的第三种选择?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-02 01:53:22

我想你是在找.transform()

代码语言:javascript
复制
# 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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49055480

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档