将 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 函数来做到这一点,因为我的代码感觉很笨拙。

如果您不介意先保存完整的dataframe,那么您可以尝试此操作。 使用chunksizedataframe分块读回,然后将每个块分别保存在循环中。

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

最新更新