【问题标题】:pandas: split dataframe into multiple csvs熊猫:将数据框拆分为多个csv
【发布时间】:2017-11-21 20:13:10
【问题描述】:

我有一个大文件,导入到 Pandas 中的单个数据框中。 我正在使用 pandas 根据数据帧中的行数将文件分成许多段。

例如:10 行: 文件 1 得到 [0:4] 文件 2 得到 [5:9]

有没有办法做到这一点而不必创建更多的数据帧?

【问题讨论】:

  • 按什么规则分割?
  • 感谢您的收获。我已经用这个细节更新了问题
  • df.iloc[0:4,:].to_csv(path) 并对其进行迭代...
  • df.iloc[:4,:]df.iloc[5:,:]
  • 为什么必须在 pandas 中这样做?根据当前描述(大文件,按行拆分),您可以使用“split”从命令行执行此操作。

标签: python-3.x pandas


【解决方案1】:

有两种方法可以做到这一点。我相信你正在寻找前者。基本上,我们打开一系列 csv 写入器,然后通过使用索引的一些基本数学运算写入正确的 csv 写入器,然后关闭所有文件。

单个DataFrame平均分成N个CSV文件

import pandas as pd
import csv, math

df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10]) # uncreative input values for 10 columns
NUMBER_OF_SPLITS = 2
fileOpens = [open(f"out{i}.csv","w") for i in range(NUMBER_OF_SPLITS)]
fileWriters = [csv.writer(v, lineterminator='\n') for v in fileOpens]
for i,row in df.iterrows():
    fileWriters[math.floor((i/df.shape[0])*NUMBER_OF_SPLITS)].writerow(row.tolist())
for file in fileOpens:
    file.close()

多个DataFrame平均分成N个CSV文件

import pandas as pd
import numpy as np

df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10]) # uncreative input values for 10 columns
NUMBER_OF_SPLITS = 2
for i, new_df in enumerate(np.array_split(df,NUMBER_OF_SPLITS)):
    with open(f"out{i}.csv","w") as fo:
            fo.write(new_df.to_csv())

【讨论】:

  • 此解决方案强制创建新的 df。
  • @billyc59 已更新。
【解决方案2】:

assign这里新增一列g,你只需要具体说明每个groupby中你想要多少个item,这里我用的是3。

df.assign(g=df.index//3)
Out[324]: 
    0  g
0   1  0
1   2  0
2   3  0
3   4  1
4   5  1
5   6  1
6   7  2
7   8  2
8   9  2
9  10  3

您可以拨打df[df.g==1]获取您需要的东西

【讨论】:

  • 我们真的需要那个新专栏吗? df[np.arange(len(df))//3==1]
【解决方案3】:

迭代 iloc 的参数就可以了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-12-04
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 2021-07-27
    • 2021-12-04
    相关资源
    最近更新 更多