Python 中数据框列的条件总和

Conditional sum of dataframe columns in Python

想知道是否可以在不创建函数的情况下在一行中重现 Python 中的以下逻辑。

z = IF (y-x) = 0 THEN a ELSE (y-x)

使用这个 df:

df = pd.DataFrame({'x': [10, 22, 31, 43, 57, 99, 65, 74, 88],
              'y':[10, 50, 31, 66, 57, 199, 75, 80, 100]})

看起来像:

    x    y
0  10   10
1  22   50
2  31   31
3  43   66
4  57   57
5  99  199
6  65   75
7  74   80
8  88  100

产生以下输出:

 x  y   z
10  10  10
22  50  28
31  31  31
43  66  23
57  57  57
99  199 100
65  75  10
74  80  6
88  100 12

我尝试了以下操作,但这 returns 是一个语法错误。

z = if(y - x) == 0: a else: (y - x)

我很感激有类似的问题,但我没有找到任何适用于我的用例或有足够的解释以便我可以重新调整代码的用途。

您可以使用 np.where:

import numpy as np
df['z'] = np.where(df['x']==df['y'], df['x'], df['y'] - df['x'])

此处,条件 df['x']==df['y'] 创建了一个长度为 len(df) 的布尔系列,其顺序与 df 相同,即具有相同的索引。然后,只要是 True,就从相应索引中的 df['x'] 中获取值,如果是 False,则从相应索引中的 df['y'] - df['x'] 中获取值。从上一句可以清楚地看出,所有三个系列必须具有相同的长度(或者必须是可广播的)。

我们得到的输出(我们分配给 df['z'])是长度为 len(df) 的数组,其中元素来自 df['x'],其中我们的条件为真,元素来自 df['y'] - df['x'] 否则。

来自文档:

If all the arrays are 1-D, where is equivalent to:

[xv if c else yv
 for c, xv, yv in zip(condition, x, y)]

因为我们这里有一维数组,我们也可以使用

df['z'] = [x if c else y_minus_x 
           for c, x, y_minus_x in zip(df['x']==df['y'], df['x'], df['y'] - df['x'])]

同样的结果。

输出:

    x    y    z
0  10   10   10
1  22   50   28
2  31   31   31
3  43   66   23
4  57   57   57
5  99  199  100
6  65   75   10
7  74   80    6
8  88  100   12