比较dataframes之间的值,并返回相应的值
问题描述:
我有两个数据帧 - df1 (800k rows) and df2 (3 rows).
比较dataframes之间的值,并返回相应的值
如果df1_A
值df2_A and df2_B
之间的df2_C
值应返回到df1_C
。
for index1, row1 in df1.iterrows():
for index2, row2 in df2.iterrows():
if (row1['df1_A'] >= row2['df2_A']) & (row1['df1_A'] <= row2['df2_B']):
row1['df1_C'] = row2['df2_C']
写这个最简单和可读的方式是使用两个for循环,但是,因为它已经绕一圈240万次,我的程序的性能降低。有没有更好的方法来完成我的任务。
答
好了,你的循环代码,转述:
for row1 in df1.rows:
for row2 in df2.rows:
if (row1.A >= row2.A) & (row1.A <= row2.B):
row1.C = row2.C
让我们翻转循环:
for row2 in df2.rows:
for row1 in df1.rows:
if (row1.A >= row2.A) & (row1.A <= row2.B):
row1.C = row2.C
现在,除去外环不是很重要,因为它只能运行三次。让我们向量化内部分:
for row2 in df2.rows:
df1.C[(df1.A >= row2.A) & (df1.A <= row2.B)] = row2.C
,并简化:
for row2 in df2.rows:
df1.C[df1.A.between(row2.A, row2.B)] = row2.C
我希望这是够好。请让我们知道这是多快。
答
让我们使用df2
只包含三行!
考虑以下量化方法:
设置:
df1 = pd.DataFrame(np.random.randint(100, size=(10**6, 1)), columns=['val'])
df2 = pd.DataFrame({'A': {0: 1, 1: 10, 2: 20}, 'B': {0: 5, 1: 13, 2: 20}})
解决方案:
qry = ' | '.join(['{0[0]}<=val<={0[1]}'.format(r) for r in df2.values.tolist()])
df1.query(qry)
时间:为1.000.000行DF:
In [34]: df1.shape
Out[34]: (1000000, 1)
In [35]: %timeit df1.query(qry)
10 loops, best of 3: 46.6 ms per loop
生成的查询:
In [36]: qry
Out[36]: '1<=val<=5 | 10<=val<=13 | 20<=val<=20'
向我们展示你的循环代码。我不知道df2_C的值应该返回给df1_C **,这意味着当你说他们有不同的长度时。 –
添加了代码。这是我与我在一起的逻辑,但由于它必须迭代的循环次数而感到困惑。 –