Pandas DF在同一计算中引用相同的切片两次

时间:2018-02-22 18:54:39

标签: python pandas

我有一个庞大的数据集要处理,我正在尝试优化最昂贵的行,处理明智。

我使用带有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)

1 个答案:

答案 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

现在,如果您想将最小列CD的值添加到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值随CD中较小的值而变化。需要注意的一点是B变成了浮点数。不知道为什么。