【发布时间】:2019-03-10 21:23:36
【问题描述】:
我有一个简单的数据库,由 2 个表(例如,项目和用户)组成,其中用户的一列是他们的 User_ID,项目的一列是他们的 Item_ID 并且 Items 的另一列是 User_ID 的外键,例如:
Items Users
Item_ID Value_A Its_User_ID ... User_ID Name ...
1 35 1 1 Alice
2 991 1 2 John
3 20 2
想象一下我想denormalize这个数据库,即在查询数据时出于性能原因,我将表用户中的列名称的值添加到表项目中。我目前的解决方案如下:
items['User_Name'] = pd.Series([users.loc[users['User_ID']==x, 'Name'].iloc[0]
for x in items['Its_User_ID']])
也就是说,我将该列添加为从理解列表构造的 Pandas 系列,它使用 .loc[] 来检索具有特定 ID 的用户的名称,并且 .iloc[0] 获取选择的第一个元素(这是唯一的,因为用户 ID 是唯一的)。
但这种解决方案对于大量项目来说确实很慢。我做了以下测试:
- 对于 1000 个项目和约 20 万用户:20 秒。
- 对于约 40 万个项目和约 20 万用户:2.5 小时。 (这是真正的数据大小)。
因为这种方法是逐列的,所以它的执行时间会随着我正在执行此过程的列数成倍增长,而且时间成本太高。虽然我没有尝试使用 for 循环逐行填充新的 Series,但我希望它的成本应该更高。还有其他我忽略的方法吗?是否有可能需要几分钟而不是几个小时的解决方案?
【问题讨论】:
标签: python pandas performance dataframe series