python - 使用 petl 使用 python 按多个字段分组
问题描述
我正在尝试按多个字段对已使用 petl 读取的表进行分组(也就是说,它是 petl 类型)。我正在尝试使用以下代码:
import petl as etl
from collections import OrderedDict
csv_ea_flood_def = r'............' #Path to csv table
ea_flood_def = etl.fromcsv(csv_ea_flood_def)
aggreg = OrderedDict()
aggreg['count'] = len
aggreg['sum_length'] = 'length', sum
EA_Defence_Types = etl.aggregate(ea_flood_def, key=('prot_type', 'asset_type', 'description'), aggregation=aggreg)
这段代码不会抛出任何错误。但是,生成的表在某种程度上似乎是空的或损坏的:
print(EA_Defence_Types[0]) 将抛出:
('prot_type', 'asset_type', 'description', 'count', 'sum_length') #which is fine
print(EA_Defence_Types[1]) 将抛出:
Traceback (most recent call last):
File "def_failure_prob.py", line 514, in <module>
main()
File "def_failure_prob.py", line 504, in main
def_fail_prob(con, cursor)
File "def_failure_prob.py", line 111, in def_fail_prob
print(EA_Defence_Types[1])
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\util\base.py", line 172, in __getitem__
return super(Table, self).__getitem__(item)
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\util\base.py", line 33, in __getitem__
return next(islice(self, item, item+1))
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\transform\reductions.py", line 308, in itermultiaggregate
for k, rows in rowgroupby(it, key):
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\util\base.py", line 715, in <genexpr>
return ((k.inner, vals) for (k, vals) in git)
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\util\base.py", line 699, in <genexpr>
it = (Record(row, flds) for row in it)
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\transform\sorts.py", line 354, in _iternocache
for row in _mergesorted(getkey, reverse, *chunkiters):
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\transform\sorts.py", line 164, in _heapqmergesorted
for element in heapq.merge(*keyed_iterables):
File "C:\ProgramData\Anaconda3\envs\env1\lib\heapq.py", line 350, in merge
h_append([next(), order * direction, next])
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\transform\sorts.py", line 162, in <genexpr>
keyed_iterables = [(_Keyed(key(obj), obj) for obj in iterable)
File "C:\ProgramData\Anaconda3\envs\env1\lib\site-packages\petl\transform\sorts.py", line 124, in _iterchunk
yield pickle.load(f)
TypeError: __new__() missing 1 required positional argument: 'flds'
我不知道那个错误可能意味着什么。
解决方案
我发现了问题。我用来计算“总和”的字段不是数字(我只需要将字符串转换为浮点数)。
推荐阅读
- azure - Azure 托管应用程序 - 带有应用程序链接的 ViewDefinition.json 操作
- javascript - 单击按钮时如何将所有其他布尔值切换为false
- mysql - 检查值是否存在于另一个(连接的)表中并相应地在结果中填写列
- linux - for 循环在 bash 中创建的整数比预期的要多
- jenkins - gitlab gui 不显示从阶段测试返回的 jenkinsfile 报告
- python - 从列表中创建可滚动区域
- windows - 如何使用 NDIS 过滤器驱动程序从协议层重定向 TCP 数据包?
- amazon-web-services - AWS Elastic Beanstalk 日志?访问更详细的日志?
- spring-boot - 是否可以使用 Ehcache 3.x 实现缓存刷新行为?
- docker - 无法使用 minikube IP 和 NodePort 连接 Pod