如何在Python中基于HORA列条件为DataFrame创建PERIODO_DIA新列?
嘿,我来帮你解决这个问题!你原来的循环逻辑之所以失效,是因为每次迭代都会把整个PERIODO_DIA列覆盖成同一个值,到最后只会保留最后一行HORA对应的结果,根本没实现逐行判断的效果。下面给你几种高效且正确的实现方式:
方法1:使用numpy.where(推荐,大数据量友好)
这是向量化操作,比循环效率高得多,适合多条件判断场景:
import numpy as np import pandas as pd # 先还原你的示例DataFrame(方便测试) data = { "DATE": ["11/01/2018", "26/02/2018", "01/01/2018", "01/01/2018", "01/01/2018"], "FOLIO_ID": ["D00001", "D00009", "D00014", "D00017", "D00018"], "LAT": [22.768507, 25.708889, 25.647176, 25.714607, 25.492993], "DIA": [4, 1, 1, 1, 1], "HORA": [15, 2, 4, 5, 9], "CIUDAD_APROXIMADA": ["SAN NICOLAS DE LOS GARZA", "SAN NICOLAS DE LOS GARZA", "GUADALUPE", "SAN NICOLAS DE LOS GARZA", "SANTIAGO"] } df = pd.DataFrame(data) # 嵌套np.where实现多条件赋值 df["PERIODO_DIA"] = np.where( (df["HORA"] > 6) & (df["HORA"] < 11), 1, np.where( (df["HORA"] > 12) & (df["HORA"] < 20), 2, np.where( (df["HORA"] > 21) & (df["HORA"] < 24), 3, 4 ) ) )
方法2:使用pandas.cut(区间划分更简洁)
如果你的规则是明确的区间划分,用cut会更直观:
# 定义区间分界点和对应标签 bins = [-float('inf'), 6, 11, 12, 20, 21, 24, float('inf')] labels = [4, 1, 4, 2, 4, 3, 4] # 生成PERIODO_DIA列 df["PERIODO_DIA"] = pd.cut(df["HORA"], bins=bins, labels=labels, include_lowest=True) # 可选:将标签转为整数类型 df["PERIODO_DIA"] = df["PERIODO_DIA"].astype(int)
方法3:使用apply(灵活但效率稍低)
如果后续需要扩展更复杂的逻辑,用apply逐行处理也可以(小数据量适用):
def get_periodo(hora): if 6 < hora < 11: return 1 elif 12 < hora < 20: return 2 elif 21 < hora < 24: return 3 else: return 4 df["PERIODO_DIA"] = df["HORA"].apply(get_periodo)
验证结果
按照你的示例数据,处理后PERIODO_DIA列的结果为:[2, 4, 4, 4, 1],完全符合规则要求。
内容的提问来源于stack exchange,提问作者MHernandez22
相关产品推荐
相关产品推荐

