python - 根据另一列的多个条件修改一列值
问题描述
如果我有以下数据框。我想根据 A 列的多个条件返回 B 列的任意值,规则如下:如果 A 列中的值 >= 0 且 <50,则返回 B 列的原始值;如果 A 列中的值 >= 50 且 < 70,则返回 B 列的值除以 3;如果 A 列中的值 >= 70 且 < 100,则返回 B 列的返回值除以 C 列和 3 列。
import pandas as pd
import numpy as np
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(100, 3)), columns=list('ABC'))
我在 Python 中的伪代码:
def Standard():
if (df['A'] >= 0) and (df['A'] < 50):
return df['B']
if (df['A'] >= 50) and (df['A'] < 70):
return df['B']/3
if (df['A'] >= 70) and (df['A'] <= 100):
return df['B']/df['C']/3
df['B'] = df.apply(Standard, axis = 1)
它返回:TypeError: ('Standard() takes 0 positional arguments but 1 was given', 'occurred at index 0')
我该如何更正我的代码,或者 Python 中是否有其他更好的方法?谢谢你的帮助。
解决方案
为了获得更好的性能,如果numpy.select
不apply
匹配任何条件,也可以设置默认值:
masks = [(df['A'] >= 0) & (df['A'] < 50),
(df['A'] >= 50) & (df['A'] < 70),
(df['A'] >= 70) & (df['A'] <= 100)]
vals = [df['B'], df['B'] / 3, df['B']/df['C']/3]
df['B'] = np.select(masks, vals, default=0)
性能- 大约快 1000 倍:
np.random.seed(5)
df = pd.DataFrame(np.random.randint(100, size=(10000, 3)), columns=list('ABC'))
#Jeril solution
In [74]: %timeit df['B1'] = df.apply(Standard, axis=1)
__main__:18: RuntimeWarning: divide by zero encountered in double_scalars
424 ms ± 16.5 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)
In [75]: %timeit df['B'] = np.select(masks, vals, default=0)
468 µs ± 4.09 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)
推荐阅读
- python - 在 Python 中使用导入文件中的变量
- cognos - COGNOS 11 - 查询计算的手动输入列
- flutter - 断言失败:第 50 行 pos 15:'image != null':在 Flutter 中不正确
- c# - 将 int 转换为 List
, ChartJS 核心 - php - Laravel 页面中的动态文本字段
- postgresql - 查询关联表PK上的多:多关系(即按关联表列过滤)
- c# - 使用 Newtonsoft 的 PopulateObject 函数时出现 JsonSerializationException
- python - ModuleNotFoundError:没有名为“code.victim”的模块;“代码”不是一个包
- javascript - 导出 PNG 画布所有 div 内容时出错
- java - 从 java admin sdk 连接到 Firestore 模拟器