我有以下数据帧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
由于布尔值为0/1,您可以简单地将条件乘以成本,然后从Rev/Cost中减去它。这给了一个很好的性能提升。你知道吗
也可以使用
np.where
或
Series.where
创建一个掩码,然后使用
loc
分配给一个子片。你知道吗相关问题 更多 >
编程相关推荐