【发布时间】:2020-06-05 17:31:28
【问题描述】:
我正在使用 pandas groupby 并申请从包含 1.5 亿行和以下列的 DataFrame 开始:
Id Created Item Stock Price
1 2019-01-01 Item 1 200 10
1 2019-01-01 Item 2 100 15
2 2019-01-01 Item 1 200 10
到一个包含 220 万条记录的列表,如下所示:
[{
"Id": 1,
"Created": "2019-01-01",
"Items": [
{"Item":"Item 1", "Stock": 200, "Price": 10},
{"Item":"Item 2", "Stock": 100, "Price": 5}
]
},
{
"Id": 2,
"Created": "2019-01-01",
"Items": [
{"Item":"Item 1", "Stock": 200, "Price": 10}
]
}]
主要使用这行代码:
df.groupby(['Id', 'Created']).apply(lambda x: x[['Item', 'Stock', 'Price']].to_dict(orient='records'))
这需要相当长的时间,据我了解,这样的操作对于 pandas 来说是很繁重的。有没有一种非 Pandas 的方式来完成同样的任务但性能更高?
编辑:该操作需要 55 分钟,我在 AWS 中使用 ScriptProcessor,它可以让我指定我想要的电量。
编辑 2: 因此,使用 artonas 解决方案我越来越接近: 这是我现在设法制作的:
defaultdict(<function __main__.<lambda>()>,
{'1': defaultdict(list,
{'Id': '1',
'Created':'2019-01-01',
'Items': [{'Item': Item2, 'Stock': 100, 'Price': 15},
{'Item': Item1, 'Stock': 200, 'Price': 10}]
})
},
{'2': defaultdict(list,
{'Id': '2',
'Created':'2019-01-01',
'Items': [{'Item': Item1, 'Stock': 200, 'Price': 10}]
})
},
但是如何从上面到这个呢?
[{
"Id": 1,
"Created": "2019-01-01",
"Items": [
{"Item":"Item 1", "Stock": 200, "Price": 10},
{"Item":"Item 2", "Stock": 100, "Price": 5}
]
},
{
"Id": 2,
"Created": "2019-01-01",
"Items": [
{"Item":"Item 1", "Stock": 200, "Price": 10}
]
}]
基本上我只对所有记录的“defaultdict(list,”之后的部分感兴趣。我需要将它放在一个不依赖于作为键的 Id 的列表中。
编辑 3:上次更新包含我的生产数据集的结果。 通过 artona 提供的公认答案,我设法从 55 分钟缩短到 7(!) 分钟。并且没有对我的代码进行任何重大更改。 Phung Duy Phong 提供的解决方案让我从 55 分钟到 17 分钟,也不错。
【问题讨论】:
-
您能否在您的数据框中分享一些行,以及您的预期输出
-
是的,我更新了帖子。
-
如果您正在寻找某种快速“矢量化”
numpy解决方案 - 不。这不是那种数值数组任务。我可以看到这样做 python 字典,但它仍然涉及遍历所有行。 -
是的,我不确定我在寻找什么,只是可能会提高性能的替代方案。感谢您的意见。
-
@Josef 这个列表应该被排序(从最低到最高的id)?
标签: python pandas numpy pandas-groupby