如何以最Pythonic的方式为Pandas DataFrame按列条件添加权重列?
给Pandas DataFrame添加条件列的最Pythonic方式
先回顾下我们的场景:
我们有这样一个基础的DataFrame:
import pandas as pd df = pd.DataFrame({'A' : [1, 2, 3], 'B' : [4, 5, 6]})
它的输出是:
A B 0 1 4 1 2 5 2 3 6
现在需要新增一列weight,规则很明确:当B列的值≥6时,weight设为20,否则设为1,预期得到的结果是:
A B weight 0 1 4 1 1 2 5 1 2 3 6 20
下面几种都是很Pythonic的实现方式,优先推荐前两种:
1. 使用numpy.where(最直观高效)
一行代码就能搞定,逻辑清晰到一眼就能看懂,绝对是首选:
import numpy as np df['weight'] = np.where(df['B'] >= 6, 20, 1)
它的逻辑就是:np.where(判断条件, 条件满足时的赋值, 条件不满足时的赋值),完美契合我们的需求,而且处理大数据集时效率也很高。
2. 纯Pandas实现(无需额外导入库)
如果不想引入numpy,用Pandas自身的方法也能写出简洁的代码:
# 方式A:用replace映射布尔值 df['weight'] = df['B'].ge(6).replace({True: 20, False: 1}) # 方式B:用map映射布尔值 df['weight'] = df['B'].ge(6).map({True: 20, False: 1})
这里ge(6)是Pandas里的方法,等价于>=6,会返回一个布尔类型的Series,接着用replace或map把True和False转换成我们需要的数值,同样很简洁。
3. 使用apply(不推荐,仅作参考)
虽然这种写法也能实现需求,但对于大规模数据集来说,apply的效率远不如前面两种,所以一般不推荐:
df['weight'] = df['B'].apply(lambda x: 20 if x >= 6 else 1)
总的来说,优先选numpy.where或者纯Pandas的映射方法,既符合Python的简洁风格,又能保证运行效率。
内容的提问来源于stack exchange,提问作者Eran Moshe
相关产品推荐
相关产品推荐

