将熊猫数据帧分割成许多较小的帧(块)并保存它们

时间:2020-06-14 21:19:36

标签: python pandas

我有一个名为df的数据帧,它有1364行(包括标题)。

第一行是列名,因此保留1363行。

我想将其拆分为n个帧(每个帧也应具有列名),并将它们另存为csv文件。

因此,假设n为30,1363/30 = 45.433

我创建了将45.433舍入为46的逻辑。然后计算剩余帧中应有多少行。基本上,它检查行数是否可被n整除。如果是的话,它将执行else部分,否则,它将通过舍入计算出余数。因此,在这种情况下,对于1363,将有29帧46行,剩下的1帧有29 (1363-(29*46))

length = len(df) #length is 1363
n = 30 

if length % n != 0:
    numrows = int(length / n) + (length % n > 0)
    remaindernumrows = length - (numrows * (n-1))
    row_counter = 1
    splitdf = pd.DataFrame()
    frame_counter = 0

    for idx, row in df.iterrows():
        if frame_counter != (n - 1):
            splitdf = splitdf.append(row)
            row_counter += 1
            print(idx, row['Name'])

            if row_counter == numrows:
                frame_counter += 1
                splitdf.to_csv(
                    f"/Users/XXX/Documents/frames/frame-{frame_counter}.csv",
                    index=False)
                splitdf = pd.DataFrame()
                row_counter = 1

        else:
            splitdf = splitdf.append(row)
            row_counter += 1
            print(idx, row['Name'])

            if row_counter == remaindernumrows:
                frame_counter += 1
                splitdf.to_csv(
                    f"/Users/XXX/Documents/frames/frame-{frame_counter}.csv",
                    index=False)
                splitdf = pd.DataFrame()
                row_counter = 1


else:
    numrows = int(length / n) + (length % n > 0)
    for idx, row in df.iterrows():
        splitdf = splitdf.append(row)
        row_counter += 1
        print(idx, row['Name'])

        if row_counter == numrows:
            frame_counter += 1
            splitdf.to_csv(
                f"/Users/XXX/Documents/frames/frame-{frame_counter}.csv",
                index=False)
            splitdf = pd.DataFrame()
            row_counter = 1

我认为我的代码可以正常工作,但是我想知道是否有更好的方法可以使用内置的pandas函数,因为我的代码感觉很笨拙。

1 个答案:

答案 0 :(得分:0)

如果您不介意先保存完整的dataframe,则可以尝试执行此操作。 使用dataframe逐个读取chunksize,然后将每个块分别保存在循环中。

n=30
reader = pd.read_csv('savedFrame.csv',chunksize=n)
for chunk in reader:
    chunk.to_save('path')
相关问题