将一个DataFrame随机拆分为几个较小的DataFrame并保存

这段代码展示了如何利用pandas的read_sql从MySQL数据库中查询数据,然后对数据进行随机洗牌,再将数据集等分为200份。每一份数据被保存为CSV文件,保存过程中使用了tqdm进行进度显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

eng = pymysql.connect(host='localhost', user='root', password='mysql', database='')
sql = 'SELECT * FROM tpco'
print('# ---- start to query -------- #')
df1 = pd.read_sql(sql, eng)
print('# ---- finish query -------- #')
# 清洗数据
shuffled = df1.sample(frac=1)
# 将数据等分为200份
results = np.array_split(shuffled, 200)
i = 0
# 循环保存数据,这里的part的类型是dataframe
for part in tqdm(results):
    name = '200_' + str(i) + '.csv'
    path = 'csv_200/' + name
    print(type(part))
    part.to_csv(path)
    i += 1
<think>我们有一个用户问题:如何将一个Pandas DataFrame拆分多个子DataFrame? 根据引用[1],我们有一个DataFrame的创建示例,其中使用了多级索引(行和列都有多级索引)。但用户的问题是关于拆分DataFrame拆分DataFrame的常见方法包括: 1. 按行拆分:例如,根据某个条件(如分组、随机抽样、按索引区间等)将行分多个子集。 2. 按列拆分:将列分多个子集。 引用[2]提到了DataFrame的基础操作和查询,引用[3]提到了删除重复项,引用[4]是关于删除标点符号的,这些引用与拆分DataFrame没有直接关系,但我们可以参考一些基础操作。 常见的拆分场景: - 按行拆分: a) 根据某个列的值进行分组,然后拆分多个子DataFrame(例如,按类别列拆分)。 b) 将DataFrame按行数平均拆分多个块(例如,每1000行一个DataFrame)。 c) 根据索引的区间拆分(例如,前100行,100-200行等)。 - 按列拆分: a) 根据列名的模式拆分(例如,所有以'A'开头的列,所有以'B'开头的列)。 b) 根据列的数据类型拆分(例如,所有数值列,所有字符列)。 我们将提供几种方法: 方法1:按行分组拆分(例如,按列'group'的值拆分) 方法2:按行数拆分(等分n块) 方法3:按索引区间拆分(手动指定区间) 方法4:按列拆分(按列名或列类型) 注意:拆分后的子DataFrame可以存储在一个字典或列表中。 我们参考引用[1]中的DataFrame结构,但用户的问题没有具体说明拆分方式,因此我们将提供通用方法。 由于用户没有提供具体的DataFrame结构,我们将假设一个普通的DataFrame。 开始回答:</think>### 如何将 Pandas DataFrame 拆分为多个子 DataFrame 在 Pandas 中拆分 DataFrame 的常见方法如下,根据**拆分维度**可分为拆分和列拆分: --- #### 一、按行拆分(纵向拆分) 1. **按分组拆分** 使用 `groupby()` 将数据按指定列的值分组,生DataFrame 字典: ```python grouped = df.groupby('category') # 按'category'列分组 sub_dfs = dict(list(grouped)) # 获取分组字典:{组名: 子DataFrame} ``` 2. **按行数等分** 使用 `np.array_split()` 将 DataFrame 平均拆分为 n 个子集: ```python import numpy as np n = 3 # 拆分为3份 sub_dfs = np.array_split(df, n) # 返回子DataFrame列表 ``` 3. **按索引区间拆分** 通过切片操作手动划分: ```python df1 = df.iloc[:100] # 前100行 df2 = df.iloc[100:200] # 第100-200行 ``` --- #### 二、按列拆分(横向拆分) 1. **按列名选择** 直接选取列集合生DataFrame: ```python numeric_cols = df.select_dtypes(include='number') # 所有数值列 text_cols = df[['name', 'description']] # 指定文本列 ``` 2. **按数据类型拆分** 使用 `select_dtypes()` 按数据类型筛选: ```python numeric_df = df.select_dtypes(include=['int64', 'float64']) object_df = df.select_dtypes(include='object') ``` --- #### 三、高级拆分方法 1. **多级索引拆分**(参考引用[^1]) 当存在多级索引时,按索引层级拆分: ```python # 假设有多级行索引 ['status','sign'] status_x = df.xs('X', level='status') # 获取status='X'的子集 ``` 2. **条件筛选拆分** 根据逻辑条件创建子集: ```python high_value = df[df['price'] > 100] # 价格>100的子集 low_value = df[df['price'] <= 100] # 价格≤100的子集 ``` --- ### 注意事项 - 拆分后的子 DataFrame 是**视图或副本**,修改副本需显式复制:`sub_df = df.iloc[0:10].copy()` - 大文件拆分建议使用**迭代读取**:`pd.read_csv('data.csv', chunksize=1000)` - 合操作可用 `pd.concat()` 实现反向操作
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值