计算每个品牌的客户数量



我正在用一个包含客户信息的数据集来试验/学习Python。

数据帧结构如下(这些结构由记录组成(:

import pandas as pd
df = pd.DataFrame({'cus_id' : [111, 222, 333, 444, 555, 666, 777, 888, 999], 
'cus_brand_id' : ['ABCD_111', 'ABCD_222', 'EFG_333', 'EFG_444', 'H_555', 'IJ_666', 'IJ_777', 'IJ_888', 'K_999']})
print(df)
cus_id cus_brand_id
0     111     ABCD_111
1     222     ABCD_222
2     333      EFG_333
3     444      EFG_444
4     555        H_555
5     666       IJ_666
6     777       IJ_777
7     888       IJ_888
8     999        K_999

如您所见,客户可以属于以下 5 个品牌之一:ABCDEFGHIJK

的目标是计算每个品牌的客户数量。也就是说,我想生成以下输出表:

| ABCD | 2 |
| EFG  | 2 |
| H    | 1 |
| IJ   | 3 |
| K    | 1 |

这是一个简单的例子,但我正在使用的真实数据集遵循相同的结构。具体来说,每个cus_brand_id条目都以一些大写字母开头,后跟下划线,后跟一些数字。

我尝试的一件事是在cus_brand_id系列上使用split方法将品牌与 id 隔离开来,但我不知道如何从这里继续。

cus_brand = df['cus_brand_id'].str.split('_')
print(cus_brand)
0    [ABCD, 111]
1    [ABCD, 222]
2     [EFG, 333]
3     [EFG, 444]
4       [H, 555]
5      [IJ, 666]
6      [IJ, 777]
7      [IJ, 888]
8       [K, 999]
Name: cus_brand_id, dtype: object

您可以先提取这些,.str[0]

>>> df['cus_brand_id'].str.split('_').str[0]
0    ABCD
1    ABCD
2     EFG
3     EFG
4       H
5      IJ
6      IJ
7      IJ
8       K
Name: cus_brand_id, dtype: object

因此,我们可以通过以下方式获得品牌:

df['brand'] = df['cus_brand_id'].str.split('_').str[0]

并计算客户数量:

>>> df.groupby('brand')['cus_id'].count()
brand
ABCD    2
EFG     2
H       1
IJ      3
K       1
Name: cus_id, dtype: int64

具有以下特征的唯一客户数量:

>>> df.groupby('brand')['cus_id'].nunique()
brand
ABCD    2
EFG     2
H       1
IJ      3
K       1
Name: cus_id, dtype: int64
In [1]:
import pandas as pd
df = pd.DataFrame({'cus_id' : [111, 222, 333, 444, 555, 666, 777, 888, 999], 
'cus_brand_id' : ['ABCD_111', 'ABCD_222', 'EFG_333', 'EFG_444', 'H_555', 'IJ_666', 'IJ_777', 'IJ_888', 'K_999']})
# new data frame with split value columns 
new = df["cus_brand_id"].str.split("_", n = 1, expand = True) 
df["brand"]= new[0] 
df["brand_id"]= new[1] 
# Dropping old cus_brand_id columns 
df.drop(columns =["cus_brand_id"], inplace = True)
# df display 
df.groupby(by='brand')['cus_id'].count()
Out [1]:
brand
ABCD    2
EFG     2
H       1
IJ      3
K       1
Name: cus_id, dtype: int64

编辑:

您始终可以在.count()之后添加.to_frame()数据帧布局而不是系列。或者to_dict()有一本以品牌为键的字典

相关内容

最新更新