Pandas DataFrame每14行分组打乱行时输出空对象如何解决?
问题原因
- Pandas的
DataFrame.append()方法不修改原对象,仅返回拼接后的新DataFrame,原代码未对返回值做赋值,导致初始的空df始终没有被更新。 - 循环内的
i += 1属于冗余代码,for循环遍历range序列时会自动更新迭代变量i,手动修改不会影响循环迭代逻辑。 - 当前Pandas版本已正式弃用
append()方法,更推荐使用pd.concat()完成数据拼接操作。
可行实现方案
方案1:优化原有循环逻辑
使用列表暂存所有打乱后的分组,最后一次性拼接,性能更高且兼容非整数倍行数的场景:
import numpy as np import pandas as pd dataset = pd.read_excel('/content/drive/MyDrive/melangev2.xlsx') df_parts = [] # 步长设为14,遍历所有分组的起始索引 for start_idx in range(0, len(dataset), 14): # 取出当前分组并随机打乱,加入临时列表 df_parts.append(dataset.iloc[start_idx : start_idx + 14].sample(frac=1)) # 拼接所有分组,重置索引避免重复 df = pd.concat(df_parts, ignore_index=True) print(df)
方案2:基于groupby的简洁实现
无需手动写循环,通过分组标签批量处理:
import numpy as np import pandas as pd dataset = pd.read_excel('/content/drive/MyDrive/melangev2.xlsx') # 生成每14行相同的分组标签 group_tag = np.arange(len(dataset)) // 14 # 按标签分组后对每个分组打乱,重置索引 df = dataset.groupby(group_tag, group_keys=False).apply(lambda x: x.sample(frac=1)).reset_index(drop=True) print(df)
内容的提问来源于stack exchange,提问作者Ishigami
相关产品推荐
相关产品推荐

