如何基于不同长度的日期、时间列表列展开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)
输出结果
运行后会得到你期望的格式:
| ID | Result |
|---|---|
| a | monday 1:00 |
| a | friday 1:00 |
| b | |
| c | |
| d | sunday 3:00 |
| d | sunday 6:00 |
关键说明
- 使用
itertools.product实现两个列表的笛卡尔积,解决了两列列表长度不一致的问题 - 针对空列表直接返回缺失值
pd.NA,匹配需求中的空结果 - 额外处理了时间格式和日期大小写,完全贴合示例输出要求
内容的提问来源于stack exchange,提问作者Bart Raeves
相关产品推荐
相关产品推荐

