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

Pandas如何用for循环按列非空值拆分DataFrame为多个子表

实现方案

你可以通过「逐行打分组标签+循环聚合分组内容」的逻辑实现,全程可通过for循环完成,不需要依赖复杂的pandas内置聚合函数,具体实现如下:

核心逻辑

  • 逐行遍历原始DataFrame,每遇到time列非空的行,就新建一个分组,记录当前分组对应的time值,后续连续的time列为空的行都归属到该分组下。
  • 遍历所有分组,过滤掉分组内text列为空的行,将剩余text内容用换行符\n拼接为单个字符串。
  • 每个分组生成一个独立的子DataFrame即可。

可直接运行的代码

import pandas as pd

# 构造示例原始数据
raw_data = [
    ["01.01.2000", None],
    [None, "abc"],
    [None, "cde"],
    [None, "def"],
    ["01.02.2000", None],
    [None, "abb"],
    [None, "bbc"],
    [None, "dde"],
    ["01.03.2000", None],
    [None, "123"],
    [None, "278"],
    [None, "782"]
]
df = pd.DataFrame(raw_data, columns=["time", "text"])

# 第一步:逐行打分组标记
group_records = []
current_gid = -1
current_group_time = None
for _, row in df.iterrows():
    # 遇到非空time,更新分组信息
    if pd.notna(row["time"]):
        current_gid += 1
        current_group_time = row["time"]
    group_records.append({
        "gid": current_gid,
        "time": current_group_time,
        "text": row["text"]
    })
grouped = pd.DataFrame(group_records)

# 第二步:循环每个分组,拼接text生成子表
sub_dataframes = []
for gid in grouped["gid"].unique():
    group_rows = grouped[grouped["gid"] == gid]
    # 过滤空text后拼接
    valid_texts = group_rows[pd.notna(group_rows["text"])]["text"].tolist()
    merged_text = "\n".join(valid_texts)
    sub_df = pd.DataFrame([
        {"time": group_rows["time"].iloc[0], "text": merged_text}
    ])
    sub_dataframes.append(sub_df)

# 按需取出对应子表即可
df1 = sub_dataframes[0]
df2 = sub_dataframes[1]
df3 = sub_dataframes[2]

输出效果

打印df1结果:

time           text
0  01.01.2000  abc\ncde\ndef

打印df2结果:

time           text
0  01.02.2000  abb\nbbc\ndde

完全匹配你需要的输出格式。如果需要动态生成df1/df2这类变量名,可以在循环里通过globals()[f"df{gid+1}"] = sub_df的方式赋值,不过更推荐用列表存储子表,方便后续批量处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 03:27:21