Python中的组合键分组
我有这样一个CSV文件:Python中的组合键分组,python,aggregation,Python,Aggregation,我有这样一个CSV文件: route|id|alias|longitude|latitude A|1|first|-33.51808226|-70.58256582 A|1|first|-33.52850414|-70.57645648 B|2|second|-33.51952529|-70.58043875 B|2|second|-33.53452223|-70.58343824 每个路由都有一个id和一个别名,对于相同的路由,它们总是相同的。此外,每条路线都有一组点,每个点由经度和纬度组成
route|id|alias|longitude|latitude
A|1|first|-33.51808226|-70.58256582
A|1|first|-33.52850414|-70.57645648
B|2|second|-33.51952529|-70.58043875
B|2|second|-33.53452223|-70.58343824
每个路由都有一个id
和一个别名
,对于相同的路由
,它们总是相同的。此外,每条路线
都有一组点
,每个点由经度
和纬度
组成。我正在尝试按路线对点进行分组,但我希望生成文件的每个字段
当我使用itertools groupby
按route
分组时,我只能生成route
和点
:
with open(self.datafile, "r") as f:
reader = csv.DictReader(f, delimiter='|')
# Group data using 'route' as key
for route, points in groupby(reader, lambda p: p['route']):
points = list(points)
points = [
{
'longitude': p['longitude'],
'latitude': p['latitude']
} for p in points
]
yield {
"_source": {
"route": route,
"points": points
}
}
我尝试了不同的方法来获取该路线的id
和alias
(比如使用route['id']
或p['id']
来获取id
,或者在现有路线之外使用另一种方法),但都不起作用
在使用groupby时,有没有一种方法可以使用复合键?或者更容易解决我的问题
我希望能够得出以下结论:
yield {
"_source": {
"route": route,
"id": id,
"alias": alias,
"points": points
}
}
如果从键
函数返回元组,则可以同时groupby
多个字段
你可以用它。for循环如下所示:
for (route, id, alias), points in groupby(reader, key=operator.itemgetter('route', 'id', 'alias')):
如果从键
函数返回元组,则可以同时groupby
多个字段
你可以用它。for循环如下所示:
for (route, id, alias), points in groupby(reader, key=operator.itemgetter('route', 'id', 'alias')):
您确实可以使用复合键groupby
:
# Group data using 'route', 'id', 'alias' as key
for route_id_alias, values in itertools.groupby(reader, lambda p: (p['route'], p['id'], p['alias'])):
points = [
{
'longitude': p['longitude'],
'latitude': p['latitude'],
} for p in values
]
print( {
"_source": {
"route": route_id_alias[0],
"id": route_id_alias[1],
"alias": route_id_alias[2],
"points": points,
}
})
在生成结果时,只需按索引访问密钥
您确实可以使用复合键groupby
:
# Group data using 'route', 'id', 'alias' as key
for route_id_alias, values in itertools.groupby(reader, lambda p: (p['route'], p['id'], p['alias'])):
points = [
{
'longitude': p['longitude'],
'latitude': p['latitude'],
} for p in values
]
print( {
"_source": {
"route": route_id_alias[0],
"id": route_id_alias[1],
"alias": route_id_alias[2],
"points": points,
}
})
在生成结果时,只需按索引访问密钥
您的预期输出是什么样的?你可以用熊猫吗。“不工作”是什么意思?2.您可以从键
lambda 3返回元组itertools.groupby
用于排序数据时效果最好(根据分组使用的相同键)对于路由,groupby中的点(读卡器,lambda p:p['route']):;点对点:;打印(点['id'],点['alias'])
工作正常如果出现错误,请提供。同时提供预期输出我试图澄清预期输出您的预期输出是什么样子的?你可以用熊猫吗。“不工作”是什么意思?2.您可以从键
lambda 3返回元组itertools.groupby
用于排序数据时效果最好(根据分组使用的相同键)对于路由,groupby中的点(读卡器,lambda p:p['route']):;点对点:;打印(点['id'],点['alias'])
工作正常如果出现错误,请提供。同时提供一个预期的输出我试图澄清预期的输出我需要了解这里发生了什么。我发布了一个和这个概念相同的答案(从键函数返回一个元组),结果被否决;然后你把这个贴出来,得到所有的荣誉。“为什么?”马蒂亚塞丁格首先:我没有抄你的答案。你发表你的作品时,我正在写我的。我们的答案在概念上确实是等价的,但你的答案更。。。概念的我认为itemgetter的使用为OP带来了不必要的复杂性。我试图给出一个非常简单且立即有用的答案(使用TYO链接)。我不明白的是为什么你的答案被否决了。顺便说一句:我只是对你的答案投了更高的票。这个评论并没有任何指责的意思,如果感觉是这样的话,我很抱歉。这更像是你说的“我不明白为什么[我的]答案被否决了”,当它归结为与你相同的事情时,但可能整个环体和TIO链接的勺子喂食真的是致命的事情…无论如何,留下评论帮助我完善了我答案的文本。谢谢你的投票。我有点需要了解这里发生了什么。我发布了一个和这个概念相同的答案(从键函数返回一个元组),结果被否决;然后你把这个贴出来,得到所有的荣誉。“为什么?”马蒂亚塞丁格首先:我没有抄你的答案。你发表你的作品时,我正在写我的。我们的答案在概念上确实是等价的,但你的答案更。。。概念的我认为itemgetter的使用为OP带来了不必要的复杂性。我试图给出一个非常简单且立即有用的答案(使用TYO链接)。我不明白的是为什么你的答案被否决了。顺便说一句:我只是对你的答案投了更高的票。这个评论并没有任何指责的意思,如果感觉是这样的话,我很抱歉。这更像是你说的“我不明白为什么[我的]答案被否决了”,当它归结为与你相同的事情时,但可能整个环体和TIO链接的勺子喂食真的是致命的事情…无论如何,留下评论帮助我完善了我答案的文本。谢谢你的投票。