python - 如何根据条件将列中的值设置为另一列
问题描述
我有以下df:
subscription|amount| Total
a |500 |
x | 0 | 5000
x |7500 | 5000
y |7500 | 5000
y | 0 | 5000
z |7500 | 5000
z | 0 | 5000
b | 0 |
b |1000 |
我想将“总计”的值转移到“金额”中已经有一个值的“金额”列,当然还有“总计”。
我过滤了:
df.loc[(df['total'].notnull()) & (df['amount']!=0)]
但无法将值从总计(5000)转移到金额。
期望的输出:
subscription|amount| Total
a |500 |
x | 0 | 5000
x |5000 | 5000
y |5000 | 5000
y | 0 | 5000
z |5000 | 5000
z | 0 | 5000
b | 0 |
b |1000 |
解决方案
如果将列更改为浮点数没有问题,还有更多解决方案 -DataFrame.loc
或numpy.where
:
mask = (df['Total'].notnull()) & (df['amount']!=0)
df.loc[mask, 'amount'] = df['Total']
df['amount'] = np.where(mask, df['Total'], df['amount'])
print (df)
subscription amount Total
0 a 500.0 NaN
1 x 0.0 5000.0
2 x 5000.0 5000.0
3 y 5000.0 5000.0
4 y 0.0 5000.0
5 z 5000.0 5000.0
6 z 0.0 5000.0
7 b 0.0 NaN
8 b 1000.0 NaN
没有将整数列更改为浮点数或转换为with 的Series.mask
解决方案:Series.where
integers
np.where
df['amount'] = df['amount'].mask(mask, df['Total'])
df['amount'] = df['amount'].where(~mask, df['Total'])
df['amount'] = df['amount'].where(~mask, df['Total']).astype(int)
print (df)
subscription amount Total
0 a 500 NaN
1 x 0 5000.0
2 x 5000 5000.0
3 y 5000 5000.0
4 y 0 5000.0
5 z 5000 5000.0
6 z 0 5000.0
7 b 0 NaN
8 b 1000 NaN
推荐阅读
- javascript - 单选按钮 Work like dropDown(选择选项)
- reactjs - 如何修复此错误在多个渲染()操作期间无法使用相同的画布
- ruby-on-rails - Rails 5:当我在开发中设置 cookie 存储时,我从设计中获得了无效的真实性令牌
- laravel - 在 Laravel 中上传头像注册失败
- react-native - React Native 测量网络带宽使用情况
- ionic-framework - 离子服务在编译 ionic 3 项目时花费了太多时间,例如 4 到 6 分钟
- docker - 关于容器化的 Docker 查询
- cordova - 离子找不到'localforage'的类型定义文件
- laravel - 如何将 sso 与广告与已经使用 oauth 登录的流明应用程序集成?
- sql - MS Access - 不明确的外部连接?