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

如何基于不同长度的日期、时间列表列展开Pandas DataFrame?

解决Pandas中不同长度列表列的笛卡尔积展开问题

针对你的需求,我们可以通过自定义函数结合apply和explode方法实现,核心是对每行的日期和时间列表做笛卡尔积组合,同时处理空列表的情况:

步骤1:准备数据并导入依赖

import pandas as pd
import itertools

data = {
    "id": ["a", "b", "c","d"],
    "refresh_days": [["Monday", "Friday"], [], [], ["Sunday"]],
    "refresh_time": [["01:00"], [], [], ["03:00", "06:00"]],
}
df = pd.DataFrame(data)

步骤2:定义行处理函数

这个函数会处理每行的日期和时间列表,生成所有可能的组合,空列表则返回缺失值:

def generate_refresh_result(row):
    days = row["refresh_days"]
    times = row["refresh_time"]
    
    # 处理空列表情况
    if not days or not times:
        return [pd.NA]
    
    # 生成日期和时间的笛卡尔积,同时格式化时间(去掉开头的0)
    combinations = []
    for day, time in itertools.product(days, times):
        # 处理时间格式,比如"01:00"转为"1:00"
        formatted_time = time.lstrip("0") if time.startswith("0") else time
        # 拼接结果,日期转为小写(匹配示例格式)
        combinations.append(f"{day.lower()} {formatted_time}")
    
    return combinations

步骤3:生成结果并展开

# 应用函数生成组合列表
df["Result"] = df.apply(generate_refresh_result, axis=1)
# 展开列表列
result_df = df.explode("Result")[["id", "Result"]].rename(columns={"id": "ID"})

print(result_df)

输出结果

运行后会得到你期望的格式:

IDResult
amonday 1:00
afriday 1:00
b
c
dsunday 3:00
dsunday 6:00

关键说明

  • 使用itertools.product实现两个列表的笛卡尔积,解决了两列列表长度不一致的问题
  • 针对空列表直接返回缺失值pd.NA,匹配需求中的空结果
  • 额外处理了时间格式和日期大小写,完全贴合示例输出要求

内容的提问来源于stack exchange,提问作者Bart Raeves

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 03:06:12