我有一个名为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
,那么您可以尝试此操作。 使用chunksize
将dataframe
分块读回,然后将每个块分别保存在循环中。
n=30
reader = pd.read_csv('savedFrame.csv',chunksize=n)
for chunk in reader:
chunk.to_save('path')