【问题标题】:Efficiently add column to Pandas DataFrame with values from another DataFrame使用来自另一个 DataFrame 的值有效地将列添加到 Pandas DataFrame
【发布时间】: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


    【解决方案1】:

    我认为如果您使用表merges 会更直接。

    items.merge(users[['User_ID', 'Name']], left_on='Its_User_ID', right_on='User_ID', how='left')
    

    这会将列名称添加到新数据集中,您当然可以稍后重命名。这将比通过 for 循环按列执行操作更有效。

    【讨论】:

      【解决方案2】:

      使用 Panda 提供的高性能数据库操作,见here

      例如:

      pd.merge(items, users, left_on='Its_User_ID', right_on='User_ID')
      

      【讨论】:

      • 重复答案?
      猜你喜欢
      • 1970-01-01
      • 2017-02-15
      • 2021-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      相关资源
      最近更新 更多