问题描述:
表格中存在每一天每时段的商品热销记录,目前需要求出每一天最热销的商品是什么?以及它一天中热销的次数。
表格形式:
时间 | 商品标签 |
2021-12-11 9:09 | 5 |
2021/12/11 10:09 | 6 |
2021-12-12 12:10 | 6 |
完整版代码:
import pandas as pd
import numpy as np
import datetime as dt
from collections import Counter
df = pd.read_csv(r'C:\Users\hanhan\PycharmProjects\pythonProject\data.csv',encoding = 'gb2312', usecols=['商品标签','时间'])
time = []
for i in range(len(df)):
starttime = df['时间'].iloc[i]
#转换成Y-m-d H:M 字符串形式
try:
starttime = str(dt.datetime.strptime(starttime, '%Y-%m-%d %H:%M'))[:-3]
except:
starttime = str(dt.datetime.strptime(starttime, '%Y/%m/%d %H:%M'))[:-3]
#将月-日存入time空列表中
time.append(starttime[6:10])
print('Counter(time)',Counter(time))
day = list(Counter(time).keys())
print('day',day)
amount = list(Counter(time).values())
print('每个商品标签数量',amount)
result1 = []
result2 = []
time1 = np.array(time)
tmp = 0
for j in range(len(day)):
# print(day[j])
list = np.argwhere(time1==day[j])
tmp = tmp + list.shape[0]
commodity = df['商品标签'].iloc[list[0][0]:tmp].values
count = np.bincount(commodity)
common_value = np.argmax(count)
print('出现最多次数的商品标签',common_value)
result1.append(common_value)
commodity_max = max(count)
print('最多出现商品标签的次数',commodity_max)
result2.append(commodity_max)
求解步骤:
(1)导入库
import pandas as pd
import numpy as np
import datetime as dt
from collections import Counter
(2)读取数据
df = pd.read_csv(r'C:\Users\hanhan\PycharmProjects\pythonProject\data.csv',encoding = 'gb2312', usecols=['商品标签','时间'])
另外设置一个空列表time = []存入日期。
(3)循环遍历时间列
处理两种不同格式的时间,利用try...expect...语句统一成一个格式,如果有个位数的时钟数或者月份数,也统一填充了,方便后面按位数取数。
将处理好的时间格式存入time列表中,利用Counter()函数遍历一个数组内的所有元素,将元素出现的次数记下来。可以看到打印它出现的格式为:元素+元素出现次数。
这个元素就是我们每一天的日期,元素出现次数就表示该天一共统计了几次热销商品,也就是一共多少行数据。
(4)每一天的数据分别求解出现次数最多的元素,及其出现次数
result1 = []
result2 = []
result1是为了存入出现最多次数的元素,result2是为了存入最多出现元素的次数。
for j in range(len(day)):
# print(day[j])
list = np.argwhere(time1==day[j])
找到每天多行数据在表格中的位置。
tmp = tmp + list.shape[0]
commodity = df['商品标签'].iloc[list[0][0]:tmp].values
list.shape[0]即为每一天数据的长度,也就是多少行。用tmp临时变量存储,例如第一天数据达56行,第二天数据达100行,所以取第二天的时候,list[0][0]为56,tmp为56+100。
count = np.bincount(commodity)
common_value = np.argmax(count)
print('出现最多次数的商品标签',common_value)
result1.append(common_value)
np.bincount()函数我理解的就是它会按照从0开始的顺序记录该数字在你的数组中出现的次数。
例如:x = np.array([0,1,1,2,3,4,7,7,7,8,9])
y = np.bincount(x)
即,数字0出现1次,数字1出现2次,数字3出现1次...
所以,通过argmax()函数返回array中数值最大数的下标,找出count里面的最大数的下标,其实就是那个出现最多次数的元素。
commodity_max = max(count)
print('最多出现商品标签的次数',commodity_max)
result2.append(commodity_max)
从count里面取最大数就好了,也就是出现最多的元素的次数。