如何用Python的Pandas将CSV文件随机打乱后按4:6拆分?
解决Pandas打乱CSV行并按比例拆分的问题
你的代码存在几个关键问题,导致没达到预期效果:
- 未导入numpy模块,代码里用了
np但没写import numpy as np np.random.permutation(df)仅返回打乱后的数组,没有将结果赋值回原DataFrame,所以原数据根本没被打乱- 切片
df[401:]会漏掉第400行,应该用df[400:]才能拿到剩下的600行
下面是两种可行的解决方案:
方法一:用Pandas内置sample方法打乱(推荐)
这个方法更简洁,直接对DataFrame操作:
import pandas as pd # 读取原始CSV df = pd.read_csv('filename.csv') # 随机打乱所有行,frac=1表示取全部数据;random_state可选,固定后可复现打乱结果 shuffled_df = df.sample(frac=1, random_state=42) # 按40%/60%拆分数据 split_point = int(len(shuffled_df) * 0.4) df_40 = shuffled_df[:split_point] df_60 = shuffled_df[split_point:] # 保存到新CSV,index=False避免写入默认索引列 df_40.to_csv('filename1.csv', index=False) df_60.to_csv('filename2.csv', index=False)
方法二:用numpy的permutation重新索引
如果坚持用numpy的方式,需要通过打乱后的索引重新排列DataFrame:
import pandas as pd import numpy as np df = pd.read_csv('filename.csv') # 生成打乱后的索引数组 shuffled_indices = np.random.permutation(len(df)) # 用打乱后的索引重构DataFrame shuffled_df = df.iloc[shuffled_indices] # 拆分和保存逻辑同方法一 split_point = int(len(shuffled_df) * 0.4) shuffled_df[:split_point].to_csv('filename1.csv', index=False) shuffled_df[split_point:].to_csv('filename2.csv', index=False)
补充说明:
index=False是为了避免把Pandas默认的索引列写入CSV,若需要保留索引可去掉该参数random_state参数可以固定随机种子,让每次运行代码的打乱结果一致,方便调试
内容的提问来源于stack exchange,提问作者Apy_dum
相关产品推荐
相关产品推荐

