Python 在同一计算中两次引用同一切片

Python 在同一计算中两次引用同一切片,python,pandas,Python,Pandas,我有一个庞大的数据集要处理,我正试图优化最昂贵的生产线,处理明智 我使用带有3列的df,a、B和C。 我有两个值,a和b,用于更新df子集中C的值 在继续之前,让我定义一个文本替换以提高可读性: filter(_X) -> df.loc[df['A'] < a, _X] 我不确定的是,python在计算表达式时是否会处理“filter”两次,或者是否会使用“reference”(a-la C++),并且只处理一次。 在前一种情况下,我有没有办法重写表达式以避免双重执行“过滤器”代码

我有一个庞大的数据集要处理,我正试图优化最昂贵的生产线,处理明智

我使用带有3列的df,a、B和C。 我有两个值,a和b,用于更新df子集中C的值

在继续之前,让我定义一个文本替换以提高可读性:

filter(_X) -> df.loc[df['A'] < a, _X]
我不确定的是,python在计算表达式时是否会处理“filter”两次,或者是否会使用“reference”(a-la C++),并且只处理一次。 在前一种情况下,我有没有办法重写表达式以避免双重执行“过滤器”代码

此外,如果您有关于如何重写“过滤器”本身的建议,我很乐意测试它们

编辑: 代码的扩展版本:

df.loc[df['A'] < a, 'C'] += a * np.minimum(df.loc[df['A'] < a, 'B'], b)
df.loc[df['A']
如果我理解正确,您可能不需要在
+=
之后“过滤两次”。请参见下面的示例:

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#您的文本替换是否严格用于堆栈溢出目的?作为一个只在Python中编码的人,C++与我的关系使我失去了思路。这可能是其他人的情况。是的,这是为了帮助他们。我正在使用扩展版本进行编辑。因此,根据您的代码,您是否尝试筛选
A
小于某个值
A
的数据帧,然后将
C
列的当前值与
B
列的最小值相加?您可能需要添加一个示例数据框,以准确显示您想要完成的任务:)是某种数组吗?返回两个数组之间的最小值。供将来的读取器参考:否,b是标量。我在df上执行多个过程(执行我文章中的行),每次b改变,但在一个过程中它是一个单一的、常量的标量。np.minimum也能够处理df列与标量的情况。在我的例子中,最小值介于df['C']和单个标量之间,但此细节不会改变解决方案。你的答案正是我想要的。谢谢我刚刚用我的原始代码测试了你的建议。显然,按照我最初编写代码的方式编写代码会更快,因为没有第二个过滤器,代码会慢得多(我不得不在等待了5次之后放弃处理,因为它仍然没有完成)。@Dirich,嗯,这很有趣!在我的测试中,我的解决方案往往更快。什么是你的
df.shape
?我用一个11列~20000行的数据框进行了测试,如果我没记错的话(直到周一才能检查)。使用较小的数据帧(我想大约5000列)导致速度降低1.5。
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
    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