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
想知道是否可以在不创建函数的情况下在一行中重现 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