python - 根据其他列的值转换或更改列的值
问题描述
我有一个包含 5 列的数据框。我想做的是将最后 4 列更改为第一列。
基本上,如果第一列的值低于某个阈值,则修改以下列,如果该值高于阈值,则没有变化。
所以我尝试了这个:
import pandas as pd
df = pd.DataFrame({
'col1' : [0.1, 0.3, 0.1, 0.2],
'col2' : [2,4,3,7],
'col3' : [3,4,4,9],
'col4' : [4,2,2,6],
'col5' : [0.3, 2.1, 1.0, .9],
})
def motif(col1, col2, col3, col4, col5):
col2 = col2
col3 = col3
col4 = col4
col5 = col5
if col1 <=.15:
col2 = col2 * .15
col3 = col3 * .15
col4 = col4 * .15
col5 = col5 * .15
return col2, col3, col4, col5
else:
return col2, col3, col4, col5
df.apply(lambda x: modify(x[col1], x[col2], x[col3], x[col4], x[col5]), axis=1)
但这不起作用。如果您有任何想法,我将不胜感激
解决方案
我们可以使用loc
选择col1
小于或等于的行,.15
然后将其余列乘以.15
:
df.loc[df['col1'] <= 0.15, 'col2':] *= 0.15
df
:
col1 col2 col3 col4 col5
0 0.1 0.30 0.45 0.6 0.045
1 0.3 4.00 4.00 2.0 2.100
2 0.1 0.45 0.60 0.3 0.150
3 0.2 7.00 9.00 6.0 0.900
col2
如果后面的所有列都过于宽泛,那么其他列选择自然会起作用:
df.loc[df['col1'] <= 0.15, ['col2', 'col3', 'col4', 'col5']] *= 0.15
df.loc[df['col1'] <= 0.15, 'col2':'col5'] *= 0.15
如果不同的列需要不同的修改,也可以保存和重复使用掩码:
m = df['col1'] <= 0.15
df.loc[m, 'col2':'col4'] *= 0.15
df.loc[m, 'col5'] *= 0.5 # col5 is different than col2-4
df
:
col1 col2 col3 col4 col5
0 0.1 0.30 0.45 0.6 0.15
1 0.3 4.00 4.00 2.0 2.10
2 0.1 0.45 0.60 0.3 0.50
3 0.2 7.00 9.00 6.0 0.90
apply
可以工作(虽然它更慢并且代码更多),但是由于apply
可以产生聚合和未聚合的结果,因此需要明确定义覆盖的列,并且结果需要是 a Series
not a tuple
:
def modify(col1, col2, col3, col4, col5):
if col1 <= .15:
col2 = col2 * .15
col3 = col3 * .15
col4 = col4 * .15
col5 = col5 * .15
return pd.Series([col2, col3, col4, col5])
df[['col2', 'col3', 'col4', 'col5']] = df.apply(lambda x: modify(
x['col1'], x['col2'], x['col3'], x['col4'], x['col5']
), axis=1)
df
:
col1 col2 col3 col4 col5
0 0.1 0.30 0.45 0.6 0.045
1 0.3 4.00 4.00 2.0 2.100
2 0.1 0.45 0.60 0.3 0.150
3 0.2 7.00 9.00 6.0 0.900
推荐阅读
- dialog - 需要在松弛对话框中输入文本的格式
- ios - Swift 中的 Google 日历 API
- amazon-web-services - AWS S3:使用访问凭证将文件从 S3 复制到远程服务器
- android - 反应本机签名的 apk 构建失败 lint 错误
- php - 为什么 $registrationDetails 显示一个空集合而不是包含 2 个项目的集合?
- python - Tkinter:如何通过函数将两个命令分配给按钮?
- php - Wordpress Nav - 带下拉菜单的水平导航
- java - 尝试使用 Secretkey 解密数据时返回的错误
- redux-form - 带有输入组件的 Redux-form 字段在第一个字符上重新呈现,导致键盘折叠
- angular - @angular-devkit/build-angular (nodeSassConfig) 无法通过 npm 下载