我正在用一个包含客户信息的数据集来试验/学习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 个品牌之一:ABCD
、EFG
、H
、IJ
和K
。
我的目标是计算每个品牌的客户数量。也就是说,我想生成以下输出表:
| 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()
有一本以品牌为键的字典