You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 23:32:53