基于其他列条件为Pandas DataFrame创建新列的方法
没问题,我来给你演示几种基于现有列条件创建新列的常用方法,结合你给出的DataFrame来举例,这样更直观。
首先先回顾下你的原始数据(先把导入和数据定义写清楚):
import pandas as pd import numpy as np df = pd.DataFrame({ "A": ["2002-01-12","2002-01-12","2002-01-12","2002-01-13","2002-01-13","2002-01-13","2002-01-16","2002-01-16","2002-01-16"], "B": ["12:00:00", "13:00:00", "14:00:00","11:00:00", "12:00:00", "13:00:00", "10:00:00", "11:00:00", "12:00:00"], "C": [3,19,15,6,1,5,3,12,8] })
1. 用np.where处理简单二元条件
适合只有「是/否」两种结果的场景,比如我们想创建一个is_early列,标记时间B早于12:00:00的行:
df['is_early'] = np.where(df['B'] < '12:00:00', True, False)
逻辑很直白:np.where(判断条件, 满足条件时的值, 不满足时的值)。这里直接比较时间字符串就行,因为你的时间是HH:MM:SS格式,字符串比较是有效的。
生成的结果片段:
| A | B | C | is_early | |
|---|---|---|---|---|
| 3 | 2002-01-13 | 11:00:00 | 6 | True |
| 6 | 2002-01-16 | 10:00:00 | 3 | True |
2. 用df.loc做灵活的条件赋值
如果需要给不同条件的行设置不同值,或者只修改特定行,loc是个好工具。比如我们想创建day_type列,给特定日期标记星期:
# 先初始化列的默认值 df['day_type'] = '其他' # 给符合条件的行赋值 df.loc[df['A'] == '2002-01-12', 'day_type'] = '周一' df.loc[df['A'] == '2002-01-13', 'day_type'] = '周二'
语法是df.loc[行筛选条件, 目标列名] = 赋值内容,分步处理多条件非常清晰。
3. 用np.select处理多条件多结果
如果有多个条件对应不同的结果,嵌套np.where会很臃肿,用np.select更清爽。比如根据C列的值创建level等级列:
# 定义条件列表和对应的结果列表 conditions = [ df['C'] > 10, # 条件1:C大于10 (df['C'] >=5) & (df['C'] <=10), # 条件2:C在5-10之间 df['C'] <5 # 条件3:C小于5 ] results = ['高', '中', '低'] # 对应每个条件的结果 df['level'] = np.select(conditions, results, default='未知')
它会按顺序检查条件,第一个满足的条件对应的结果会被选中,default是所有条件都不满足时的兜底值。注意多条件要用&(且)/|(或)连接,每个条件要加括号避免优先级问题。
生成的level列结果:低、高、高、中、低、中、低、高、中
4. 用apply处理复杂自定义逻辑
如果你的条件逻辑特别复杂,没法用向量方法简洁表达,可以用apply结合自定义函数。比如结合日期和时间创建time_slot列:
def get_time_slot(row): if row['A'] == '2002-01-12' and row['B'] == '12:00:00': return '时段1' elif row['A'] == '2002-01-13' and row['B'] == '11:00:00': return '时段2' else: return '其他时段' # axis=1表示按行处理,把每一行数据传入函数 df['time_slot'] = df.apply(get_time_slot, axis=1)
不过要注意:apply的效率比前面的向量方法低,如果你的DataFrame数据量很大,优先用前三种方法。
内容的提问来源于stack exchange,提问作者Tie_24
相关产品推荐
相关产品推荐

