【问题标题】:python/pandas - would like to remove nested loops to improve run timepython/pandas - 想删除嵌套循环以提高运行时间
【发布时间】:2016-04-09 15:56:16
【问题描述】:

鉴于以下情况:

import pandas as pd
from pandas import *
from numpy import *

df = pd.DataFrame(columns=['A', 'B', 'C'])
df['A'] = [1,1,1,2,2,2,3,3,3,4,4,4,5,5,5]
df['B'] = ['a','b','c','a','b','c','a','b','c','a','b','c','a','b','c']

list_a = list(df['A'].unique())
list_b = list(df['B'].unique())

我想删除以下循环以加快下一步的速度...

for i in list_a:
    for j in list_b:
        df.ix[(df['A']==i) & (df['B']==j), 'C'] = i*j

超过数万行,这非常慢。感谢您的任何见解。

请注意 - i*j 无关紧要 - 我从查找表中拉出 = 的另一侧,这会使示例复杂化。

编辑:我相信这是一个基于 list_a 和 list_b 中的项目的索引问题,因此我可以在我之前提到的 ref 表中搜索并写入过滤后的 df['C']。再次感谢。

【问题讨论】:

  • df['C'] = df['B'] * df['A'] 会起作用吗?它可以为您提供与当前相同的答案,而且速度要快得多
  • 嗨,johnchase - 抱歉,我不清楚。练习的重点是我使用 i 和 j 在我提到的查找表中进行搜索......所以我认为这确实是一个索引问题。
  • 描述您的“查找表”可能会有很大帮助。它是另一个数据框吗?您是否将ij 插入到SQL 查询中?等等。可能有一种方法可以将查找向量化并显着加快速度。
  • 当然是exp1orer——它是一个包含A、B和C列的数据框——我需要A和B才能找到C。但是,这似乎不是瓶颈。即使我将 df.ix[(df['A']==i) & (df['B']==j), 'C'] 设置为 1,循环遍历我的数据集。
  • 对。我的观点是,根据= 标志右侧发生的实际,您可以完全避免 list_a 和 list_b 并直接对 df['A']df['B'] 进行操作,这会更快。

标签: python loops pandas indexing vectorization


【解决方案1】:

你可以这样做:

df['C'] = df['B'] * df['A']

这将对df['A']df['B']中的匹配对应用*的逐个元素操作

【讨论】:

  • 嗨 sedavidw - 在我看到你的答案之前,我写信给上面的 johnchase “练习的重点是我使用 i 和 j 在我提到的查找表中搜索......所以我认为这确实是一个索引问题。”抱歉,我的问题不清楚。
猜你喜欢
  • 2023-03-09
  • 1970-01-01
  • 1970-01-01
  • 2014-12-14
  • 2016-01-18
  • 2021-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多