本文继续使用python解决工作中的实际问题。从问题的本身来看,好像只能够用python编程来解决。那就只能硬着头皮往前走了。
01 具体的问题
我们需要计算某一家门店的品规再购率。意思是说,小李家上个月购买了三种同类品牌,这个月接着购买三个同类品牌,但是总的购买数5,所以我们就用这3个品规除以5,就是小李家当期的再购率。
具体的数据图表如下:


具体地思路
读取数据 找到上期购买的品牌,本期继续购买的终端数的数量 将数据汇总
02具体解决步骤
import pandas as pd
import numpy as np
import os
# 1.读取数据
df1 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.03-8.09购进.xls')
df2 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.10-8.16购进.xls')
df1 = df1[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
'黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
'红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
'好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
df2 = df2[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
'黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
'红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
'好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
# 整理列表复制
接下来需要计算上期购买的品牌,本期继续购买的终端的数量。
dt = {}
for i in range(len(df2)):
row_ls = []
x1 = list(df2.iloc[i]) #确定现期
x2 = df1[df1['许可证号'] == x1[0]] #基期
if len(x2) == 0: #没有匹配到
continue
elif len(x2) == 1:
x2 = list(x2.values[0]) #找到了具体的终端数
for xx in range(1,31): #考虑列的情况
if x1[xx] != 0 and x2[xx] != 0: #说明现期和基期的品牌都有购买的
row_ls.append(1)
else:
row_ls.append(0)
else:
print(x1[0]) # 主要表明是否有重复值
dt_m = {x1[0]:row_ls}
dt.update(dt_m)
df_z = pd.DataFrame(dt).T
df_z复制
输出结果为:

接下来需要做的就是将其全部相加,计算回购的数量
df_z = df_z.apply(lambda x:sum(x),axis = 1)
df_z复制
输出结果为:
420381105071 17
420301182194 9
420301182582 14
420301182620 12
420301183346 10
420301183765 11
420301183992 5
420301184119 12
420302101385 8
420302106761 7
420303100775 14
420303107636 11复制
然后除以总的品牌数,将其整理即可
df_zz = pd.DataFrame(df_z)
df_zz = df_zz.apply(lambda x:round(x/30,2),axis = 1)
np.mean(df_zz).values[0]复制
输出结果为:
0.35
复制
接下来需要做的就是将整个表全部读出来
import pandas as pd
import numpy as np
import os
road = os.listdir(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次')
zg = []
for t in range(8):
dm = {}
df1 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\{}'.format(road[t]))
df2 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\{}'.format(road[t+1]))
df1 = df1[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
'黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
'红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
'好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
df2 = df2[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
'黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
'红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
'好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
for i in range(len(df2)):
row_columns = []
x1 = list(df2.iloc[i])
x2 = df1[df1['许可证号'] == x1[0]]
if len(x2) == 0:
continue
elif len(x2) == 1:
x2 = list(x2.values[0])
for xx in range(1,31):
if x1[xx] != 0 and x2[xx] != 0:
row_columns.append(1)
else:
row_columns.append(0)
else:
print(x1[0])
dr = {x1[0]:row_columns}
dm.update(dr)
dzg = pd.DataFrame(dm).T
dzg_z = dzg.apply(lambda x:sum(x),axis = 1)
dzg_zz = pd.DataFrame(dzg_z)
df_zgl = dzg_zz.apply(lambda x:round(x/30,2),axis = 1)
zg.append(round(np.mean(df_zgl).values[0],2))
print(zg)复制
输出结果为:
[0.36, 0.34, 0.35, 0.33, 0.35, 0.41, 0.36, 0.36]
复制
整个项目涉及到的知识点较多,需要认真消化。
03 项目知识点
看一下具体的数据形态
import pandas as pd
import numpy as np
import os
df1 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.03-8.09购进.xls')
df2 = pd.read_excel(r'F:\慧辰\品吸云\状态研判讨论_0517\数据\地区指数数据\计算再购率\一期一次\8.10-8.16购进.xls')
df1 = df1[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
'黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
'红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
'好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]
df2 = df2[['许可证号','黄鹤楼(1916软)','黄鹤楼(1916硬)','中华(软)','中华(硬)','黄鹤楼(软珍品)','黄鹤楼(硬珍品)','黄鹤楼(硬峡谷柔情)','黄鹤楼(硬奇景)',
'黄鹤楼(软红)','黄鹤楼(硬红)','黄鹤楼(软蓝)','黄鹤楼(天下名楼)','黄鹤楼(软雪之景) ','红金龙(硬蓝爱你)','红金龙(软精品)','红金龙(硬神州腾龙)','红金龙(硬新版) ',
'红金龙(软蓝九州腾龙)','红金龙(软虹之彩)','南京(炫赫门)','利群(新版)','娇子(软阳光)','黄金叶(喜满堂) ','云烟(紫)',' 红河(软88)','红塔山(硬经典100)','红塔山(软经典)',
'好猫(金猴王)','钻石(硬蓝)','雄狮(薄荷)']]复制
看一下具体的数据形态:
for i in range(len(df2)):
x1 = list(df2.iloc[i])
print(x1)复制
输出结果为:
[420381105071, 0, 0, 1, 2, 3, 4, 0, 3, 4, 5, 15, 1, 1, 1, 5, 5, 2, 2, 1, 2, 4, 2, 2, 2, 0, 0, 0, 1, 0, 1]
[420301182194, 0, 0, 0, 0, 1, 1, 1, 0, 2, 0, 8, 0, 0, 1, 5, 2, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[420301182582, 0, 0, 0, 0, 0, 4, 0, 1, 0, 5, 14, 2, 1, 2, 5, 2, 2, 2, 0, 2, 3, 2, 0, 0, 0, 0, 0, 0, 0, 0]
[420301182620, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 10, 0, 0, 1, 5, 2, 2, 2, 0, 2, 2, 2, 0, 0, 0, 0, 1, 0, 0, 0]
.....复制
这个比较好理解,把每一行都遍历了一遍。这个是现期的数据.
接下来继续:
x2 = df1[df1['许可证号'] == x1[0]]
print(x2)复制
我们首先进行猜测,这个一看就知道是x2是列表类型,然后再来打印出来看具体的形式,输出结果为:
许可证号 黄鹤楼(1916软) 黄鹤楼(1916硬) 中华(软) 中华(硬) 黄鹤楼(软珍品) 黄鹤楼(硬珍品) \
154 420381105071 1 0 0 0 3 4
黄鹤楼(硬峡谷柔情) 黄鹤楼(硬奇景) 黄鹤楼(软红) ... 利群(新版) 娇子(软阳光) 黄金叶(喜满堂) 云烟(紫) \
154 1 0 4 ... 4 0 0 2
红河(软88) 红塔山(硬经典100) 红塔山(软经典) 好猫(金猴王) 钻石(硬蓝) 雄狮(薄荷)
154 0 0 0 1 2 1
[1 rows x 31 columns]复制
我们可以使用type
函数知道数据类型
print(type(X2))
复制
输出结果为:
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>
<class 'pandas.core.frame.DataFrame'>复制
我们知道了 x2
的数据类型是dataframe
而dataframe
有两种属性,一种是 columns
其二是 values
这个地方要说明
将其转为list
为:
x3 = list(x2)
print(x3)复制
输出结果为:
['许可证号', '黄鹤楼(1916软)', '黄鹤楼(1916硬)', '中华(软)', '中华(硬)', '黄鹤楼(软珍品)', '黄鹤楼(硬珍品)', '黄鹤楼(硬峡谷柔情)', '黄鹤楼(硬奇景)', '黄鹤楼(软红)', '黄鹤楼(硬红)', '黄鹤楼(软蓝)', '黄鹤楼(天下名楼)', '黄鹤楼(软雪之景) ', '红金龙(硬蓝爱你)', '红金龙(软精品)', '红金龙(硬神州腾龙)', '红金龙(硬新版) ', '红金龙(软蓝九州腾龙)', '红金龙(软虹之彩)', '南京(炫赫门)', '利群(新版)', '娇子(软阳光)', '黄金叶(喜满堂) ', '云烟(紫)', ' 红河(软88)', '红塔山(硬经典100)', '红塔山(软经典)', '好猫(金猴王)', '钻石(硬蓝)', '雄狮(薄荷)']
['许可证号', '黄鹤楼(1916软)', '黄鹤楼(1916硬)', '中华(软)', '中华(硬)', '黄鹤楼(软珍品)', '黄鹤楼(硬珍品)', '黄鹤楼(硬峡谷柔情)', '黄鹤楼(硬奇景)', '黄鹤楼(软红)', '黄鹤楼(硬红)', '黄鹤楼(软蓝)', '黄鹤楼(天下名楼)', '黄鹤楼(软雪之景) ', '红金龙(硬蓝爱你)', '红金龙(软精品)', '红金龙(硬神州腾龙)', '红金龙(硬新版) ', '红金龙(软蓝九州腾龙)', '红金龙(软虹之彩)', '南京(炫赫门)', '利群(新版)', '娇子(软阳光)', '黄金叶(喜满堂) ', '云烟(紫)', ' 红河(软88)', '红塔山(硬经典100)', '红塔山(软经典)', '好猫(金猴王)', '钻石(硬蓝)', '雄狮(薄荷)']复制
接下来我们设置值
x3 = list(x2.values)
print(x3)复制
输出结果为:
[array([420381105071, 1, 0, 0,
0, 3, 4, 1,
0, 4, 4, 12,
3, 1, 1, 3,
5, 2, 1, 0,
2, 4, 0, 0,
2, 0, 0, 0,
1, 2, 1], dtype=int64)]
....复制
因为x2
是一个dataframe
所以我们可以看到values
print(x2.values)
复制
输出结果为:
[[420381105071 1 0 0 0
3 4 1 0 4
4 12 3 1 1
3 5 2 1 0
2 4 0 0 2
0 0 0 1 2
1]]
<class 'numpy.ndarray'>
[[420301182194 0 0 0 0
0 1 0 0 2
2 8 0 2 1
2 2 2 1 0
0 1 0 0 1
0 1 0 0 0
0]]
<class 'numpy.ndarray'>
[[420301182582 1 0 0 0
0 3 1 1 2
2 11 1 1 2
3 2 2 1 0
1 3 1 1 2
0 0 0 0 0
0]]
<class 'numpy.ndarray'>复制
所以我们知道这个是一个列表,里面涵盖一个元素
继续改进为:
x3 = list(x2.values[0])
print(x3)复制
输出结果为:
[420381105071, 1, 0, 0, 0, 3, 4, 1, 0, 4, 4, 12, 3, 1, 1, 3, 5, 2, 1, 0, 2, 4, 0, 0, 2, 0, 0, 0, 1, 2, 1]
[420301182194, 0, 0, 0, 0, 0, 1, 0, 0, 2, 2, 8, 0, 2, 1, 2, 2, 2, 1, 0, 0, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0]
[420301182582, 1, 0, 0, 0, 0, 3, 1, 1, 2, 2, 11, 1, 1, 2, 3, 2, 2, 1, 0, 1, 3, 1, 1, 2, 0, 0, 0, 0, 0, 0]
[420301182620, 0, 0, 0, 0, 3, 2, 0, 1, 3, 2, 8, 0, 2, 2, 3, 2, 2, 1, 0, 1, 2, 1, 1, 1, 0, 1, 0, 0, 0, 0]
[420301183346, 0, 0, 0, 0, 0, 1, 0, 1, 2, 0, 8, 0, 1, 2, 1, 1, 2, 0, 0, 1, 1, 1, 1, 1, 0, 1, 0, 0, 0, 0]复制
这个地方需要有python的基础知识要非常熟练,其二,在学习的过程中,如果遇到不懂的问题可以先打印出来不停地尝试即可。
往期回顾
文章转载自牛谈琴,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
[MYSQL] 服务器出现大量的TIME_WAIT, 每天凌晨就清零了
大大刺猬
141次阅读
2025-04-01 16:20:44
演讲实录|分布式 Python 计算服务 MaxFrame 介绍及场景应用方案
阿里云大数据AI技术
121次阅读
2025-03-17 13:27:37
mysql提升10倍count(*)的神器
大大刺猬
119次阅读
2025-03-21 16:54:21
官宣,Milvus SDK v2发布!原生异步接口、支持MCP、性能提升
ZILLIZ
96次阅读
2025-04-02 09:34:13
[MYSQL] query_id和STATEMENT_ID在不同OS上的关系
大大刺猬
64次阅读
2025-03-26 19:08:13
DataWorks :Data+AI 一体化开发实战图谱
阿里云大数据AI技术
46次阅读
2025-03-19 11:00:55
国密算法介绍
漫步者
44次阅读
2025-03-21 09:20:39
如何使用 RisingWave 和 PuppyGraph 构建高性能实时图分析框架
RisingWave中文开源社区
37次阅读
2025-03-18 10:49:54
WingPro for Mac 强大的Python开发工具 v10.0.9注册激活版
一梦江湖远
32次阅读
2025-03-29 10:33:27
python操作MySQL数据库
怀念和想念
29次阅读
2025-03-30 23:22:07