我有一个庞大的数据集要处理,我正在尝试优化最昂贵的行,处理明智。
我使用带有3列A,B和C的df。 我有2个值a和b,它们用于更新df子集中的C值。
在继续之前,让我定义一个文本替换以提高可读性:
filter(_X) -> df.loc[df['A'] < a, _X]
每次输入&#34; filter&#34;时,请将其替换为右侧的文本(使用正确的参数代替参数_X - 想想C / C ++宏)。 有问题的代码行是:
filter('C') += a * np.minimum(filter('B'), b)
我不确定的是,如果python将处理&#34;过滤&#34;评估表达式时两次,或者它将使用&#34;引用&#34; (a-la C ++)并且只做一次。 在前一种情况下,有没有办法让我以某种方式重写表达式,以避免双重执行&#34; filter&#34;?
此外,如果您有关于如何重写&#34;过滤器&#34;的建议。本身,我很乐意测试它们。
编辑: 代码的扩展版本:
df.loc[df['A'] < a, 'C'] += a * np.minimum(df.loc[df['A'] < a, 'B'], b)
答案 0 :(得分:1)
如果我理解正确,您可能不需要过滤两次&#34;在+=
之后。请参阅下面的示例:
np.random.seed(5)
df = pd.DataFrame(np.random.randint(0,100,size=(4, 4)), columns=list('ABCD'))
A B C D
0 99 78 61 16
1 73 8 62 27
2 30 80 7 76
3 15 53 80 27
现在,如果您想将最小列C
和D
的值添加到B
的当前值,那么只需:df.loc[df['A'] < 80, 'B'] += np.minimum(df['C'], df['D'])
A B C D
0 99 78.0 61 16
1 73 35.0 62 27 #<--- meets condition 8+27=35
2 30 87.0 7 76 #<--- meets condition 80+7=87
3 15 80.0 80 27 #<--- meets condition 53+27=80
请注意A
&lt;何时80. B
值随C
或D
中较小的值而变化。需要注意的一点是B
变成了浮点数。不知道为什么。