我有一个名为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函数,因为我的代码感觉很笨拙。
答案 0 :(得分:0)
如果您不介意先保存完整的dataframe
,则可以尝试执行此操作。
使用dataframe
逐个读取chunksize
,然后将每个块分别保存在循环中。
n=30
reader = pd.read_csv('savedFrame.csv',chunksize=n)
for chunk in reader:
chunk.to_save('path')