在数据分析工作中,我们常常要把一个Pandas的DataFrame按照固定的循环模式拆分开,例如每隔若干行就轮换一次分组。本文介绍两种在Python中利用Pandas实现该需求的实用方法,并给出完整代码示例。

方法一:利用行号取模进行拆分
这种方法的核心是为每一行计算其在循环周期中的位置,然后用取模运算得到分组编号,最后按编号提取子集。
示例代码
import pandas as pd
# 构造示例数据
df = pd.DataFrame({
'id': range(1, 11),
'value': [10, 20, 30, 40, 50, 60, 70, 80, 90, 100]
})
# 设定循环周期,例如每3行一轮
cycle = 3
# 根据行号取模得到分组标签
df['group'] = df.index % cycle
# 按分组拆分
groups = []
for i in range(cycle):
sub = df[df['group'] == i].drop(columns='group')
groups.append(sub)
# 查看拆分结果
for idx, g in enumerate(groups):
print('分组', idx)
print(g)
上述代码中,df.index % cycle 会生成 0、1、2、0、1、2 这样的循环序列,从而把原始数据均分成三个按循环模式排列的子DataFrame。
方法二:使用groupby按循环标签聚合
与方法一类似,我们先构造循环标签列,再使用 groupby 一次性得到所有分组,代码更加简洁。
示例代码
import pandas as pd
df = pd.DataFrame({
'name': ['a', 'b', 'c', 'd', 'e', 'f'],
'score': [88, 92, 75, 60, 85, 77]
})
cycle = 2
# 添加循环模式标签
df['label'] = df.index % cycle
# 使用groupby拆分
result = {name: group.drop(columns='label') for name, group in df.groupby('label')}
# 输出每个分组
for k, v in result.items():
print('标签', k)
print(v)
通过 groupby 方法,我们无需手动写循环筛选,Pandas会自动按 label 列完成拆分,适合周期数较多或数据量较大的情况。
两种方法的对比
| 方法 | 优点 | 适用场景 |
|---|---|---|
| 行号取模筛选 | 逻辑直观,易于调试 | 周期少、需要逐步处理分组 |
| groupby聚合 | 代码简短,性能好 | 周期多、批量获取分组 |
在实际开发中,如果只需要简单拆分,取模筛选足够;若追求代码优雅和处理效率,推荐直接使用 groupby。掌握这两种按循环模式拆分DataFrame的方式,能让你在面对规律性的数据切分任务时更加从容。