Python 基于另一列有条件地更改数据帧列';s值

Python 基于另一列有条件地更改数据帧列';s值,python,pandas,dataframe,Python,Pandas,Dataframe,我有以下数据帧d1: +----------+-------+---------+--------------+ | Item Num | Cost | Revenue | Rev / Cost | +----------+-------+---------+--------------+ | 1 | 45.76 | 345.67 | 7.5539772727 | | 2 | 55.78 | 456.92 | 8.1914664754 | |

我有以下数据帧
d1

+----------+-------+---------+--------------+
| Item Num | Cost  | Revenue |  Rev / Cost  |
+----------+-------+---------+--------------+
|        1 | 45.76 |  345.67 | 7.5539772727 |
|        2 | 55.78 |  456.92 | 8.1914664754 |
|        3 | 34.68 |       0 |            0 |
|        4 | 79.85 |       0 |            0 |
+----------+-------+---------+--------------+
我希望
Cost/Rev
列的值等于该行的
Cost
,如果“Cost/Rev”等于0,则乘以负1

因此,期望的输出是:

+----------+-------+---------+--------------+
| Item Num | Cost  | Revenue |  Rev / Cost  |
+----------+-------+---------+--------------+
|        1 | 45.76 |  345.67 | 7.5539772727 |
|        2 | 55.78 |  456.92 | 8.1914664754 |
|        3 | 34.68 |       0 |       -34.68 |
|        4 | 79.85 |       0 |       -79.85 |
+----------+-------+---------+--------------+
到目前为止,我得到的是:

d1['Rev / Cost'] = d1['Rev / Cost'].apply(lambda x: x if x > 0 else d1['Cost'])
它只是用一个值覆盖预期范围,并抛出以下警告:

A value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

创建一个掩码,然后使用
loc
分配给子掩码

mask = df['Rev / Cost'] == 0
df.loc[mask, 'Rev / Cost'] = df.loc[mask, 'Cost'].mul(-1)

创建一个掩码,然后使用
loc
分配给子掩码

mask = df['Rev / Cost'] == 0
df.loc[mask, 'Rev / Cost'] = df.loc[mask, 'Cost'].mul(-1)

由于布尔值计算为0/1,您只需将条件乘以成本,然后将其从Rev/Cost中减去即可。这将大大提高性能

df['Rev / Cost'] -=  df['Cost'] * (df['Rev / Cost'] == 0)
您也可以使用
np.where

df['Rev / Cost'] = np.where(df['Rev / Cost'] == 0, -df['Cost'], df['Rev / Cost']
df['Rev / Cost'] = df['Rev / Cost'].where(lambda x: x != 0, df.Cost)
系列。其中

df['Rev / Cost'] = np.where(df['Rev / Cost'] == 0, -df['Cost'], df['Rev / Cost']
df['Rev / Cost'] = df['Rev / Cost'].where(lambda x: x != 0, df.Cost)

由于布尔值计算为0/1,您只需将条件乘以成本,然后将其从Rev/Cost中减去即可。这将大大提高性能

df['Rev / Cost'] -=  df['Cost'] * (df['Rev / Cost'] == 0)
您也可以使用
np.where

df['Rev / Cost'] = np.where(df['Rev / Cost'] == 0, -df['Cost'], df['Rev / Cost']
df['Rev / Cost'] = df['Rev / Cost'].where(lambda x: x != 0, df.Cost)
系列。其中

df['Rev / Cost'] = np.where(df['Rev / Cost'] == 0, -df['Cost'], df['Rev / Cost']
df['Rev / Cost'] = df['Rev / Cost'].where(lambda x: x != 0, df.Cost)