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
相关产品推荐
相关产品推荐

