【发布时间】: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 在我提到的查找表中进行搜索......所以我认为这确实是一个索引问题。
-
描述您的“查找表”可能会有很大帮助。它是另一个数据框吗?您是否将
i和j插入到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