基于另一列的值有条件地更改数据帧列

2024-04-18 22:37:06 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下数据帧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

Tags: 数据lambda警告ifvalue情况revitem
2条回答

由于布尔值为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']

Series.where

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

创建一个掩码,然后使用loc分配给一个子片。你知道吗

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

相关问题 更多 >