如何按自定义不规则块遍历结构重复的pandas DataFrame?
如何按自定义不规则块遍历结构重复的pandas DataFrame?
首先,这种重复块且块大小不固定的DataFrame,核心思路是先定位每个块的起始边界,再逐个提取并处理块内容。我之前处理过类似的非结构化表格,分享下具体步骤:
步骤1:定位所有块的起始位置
你的每个块都是以Week开头的,所以我们先找出所有值为Week的行索引,这些索引就是每个块的起始点。最后再加上DataFrame的总行数,确保最后一个块也能被完整覆盖。
import pandas as pd # 先模拟你的数据结构(如果你的df是单列存储的话) raw_data = [ "Week", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "City A", 100, 300, "x", "z", "w", "City B", 200, 400, "y", "q", "p", None, None, None, None, None, None, "Week", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "City A", 150, 320, "a", "c", "e", "City B", 210, 470, "z", "t", "q", "City C", 260, 446, "b", "d", "f", None, None, None, None, None, None ] df = pd.DataFrame(raw_data, columns=["content"]) # 找出所有"Week"所在的行索引 block_starts = df[df["content"] == "Week"].index.tolist() # 加上最后一行的下一个索引,确保最后一个块被包含 block_starts.append(len(df))
步骤2:遍历每个块并提取有效数据
有了块的起始索引后,我们就可以逐个切分块。每个块里包含了列名(周一到周五)、城市数据,还有用来分隔的None行,我们需要把这些内容清洗成结构化的表格:
for idx in range(len(block_starts) - 1): # 提取当前块的子DataFrame start = block_starts[idx] end = block_starts[idx + 1] current_block = df.iloc[start:end] # 1. 提取列名:块的第2到第6行是周一到周五,加上"City"列 column_names = ["City"] + current_block.iloc[1:6, 0].tolist() # 2. 提取城市的有效数据:跳过前6行(Week+5个工作日),过滤掉None行 city_rows = current_block.iloc[6:][current_block.iloc[6:]["content"].notna()] # 3. 每6行对应一个城市(1行城市名+5行数据),分组转换为结构化行 processed_data = [] # 按6行一组遍历城市数据 for i in range(0, len(city_rows), 6): city_group = city_rows.iloc[i:i+6] city_name = city_group.iloc[0, 0] city_values = city_group.iloc[1:, 0].tolist() processed_data.append([city_name] + city_values) # 4. 转换为结构化的DataFrame,现在就可以做你需要的操作了 structured_chunk = pd.DataFrame(processed_data, columns=column_names) # 这里替换成你的业务操作,比如打印、计算统计值等 print(f"第{idx+1}周的结构化数据:") print(structured_chunk) print("-" * 60)
关键说明
- 这个方法不需要硬编码块的大小,不管每个块里有2个还是3个城市,都能自动适配;
- 如果你的原始DataFrame不是单列结构,只需要调整定位
Week的逻辑(比如是某一列的值为Week),核心的块切分思路是一样的; - 处理块内数据时,可以根据你的实际需求调整清洗逻辑,比如数据类型转换、缺失值处理等。
备注:内容来源于stack exchange,提问作者Lucas B. Bahadir
相关产品推荐
相关产品推荐

