数据筛选:Namedtuple 的使用
一、需求:
需要对上面xls文档进行数据筛选。当要多列数据结合统计时,使用Namedtuple比字典高效。
二、原因:
Namedtuple比普通tuple具有更好的可读性,可以使代码更易于维护。同时与字典相比,又更加的轻量和高效。但是有一点需要注意,就是namedtuple中的属性都是不可变的。任何尝试改变其属性值的操作都是非法的。
三、使用:
为了构造一个namedtuple需要两个参数,分别是tuple的名字和其中域的名字。比如,tuple的名字是“apply”,它包括三个域,分别是“box_type”、“option”和“trade”。
- 源码
import json
from collections import namedtuple
import numpy as np
applies = ('box_type', 'option', 'trade')
box_type = ("40RH", "45HC", "40HC", "40ST", "20ST")
all_boxes = {
'未申请': {},
'已申请未打印': {},
'已提箱': {},
'已打印': {}
}
apply = namedtuple("apply", applies)
# usecols=(5, 10, 31),分别获取第 6, 11,32 这三列
resources = np.array(np.loadtxt(
'report_customized_20211205134657.csv',
dtype=str, delimiter=',', skiprows=1, usecols=(5, 10, 31), encoding='gbk'))
for result in map(apply._make, resources):
if result.trade == 'EUROPE':
if result.box_type in box_type:
if result.box_type not in all_boxes[result.option]:
all_boxes[result.option][result.box_type] = 1
else:
all_boxes[result.option][result.box_type] += 1
info = json.dumps(all_boxes, indent=4, ensure_ascii=False)
print(f"统计结果: {info}")
- 结果
namedtupl:
apply(box_type='40ST', option='已提箱', trade='EUROPE')
统计结果: {
"未申请": {
"40HC": 285,
"40ST": 58,
"20ST": 79,
"40RH": 34
},
"已申请未打印": {
"40HC": 76,
"20ST": 38,
"40RH": 1,
"40ST": 28
},
"已提箱": {
"40RH": 31,
"40HC": 623,
"20ST": 205,
"40ST": 191,
"45HC": 1
},
"已打印": {
"40HC": 6,
"40ST": 2,
"20ST": 2
}
}