Python 如果数据帧的行数超过10行,则将其一分为二
我有一个巨大的CSV,有许多表格和许多行。如果每个数据帧包含10行以上,我只想将其拆分为2行 如果为true,我希望第一个数据帧包含前10个数据帧,其余数据帧包含在第二个数据帧中 有没有方便的功能?我环顾四周,但没有发现有用的东西Python 如果数据帧的行数超过10行,则将其一分为二,python,pandas,split,dataframe,Python,Pandas,Split,Dataframe,我有一个巨大的CSV,有许多表格和许多行。如果每个数据帧包含10行以上,我只想将其拆分为2行 如果为true,我希望第一个数据帧包含前10个数据帧,其余数据帧包含在第二个数据帧中 有没有方便的功能?我环顾四周,但没有发现有用的东西 i、 e.split_数据帧(df,2(如果>10)) 没有特定的便利功能 您必须执行以下操作: first_ten = pd.DataFrame() rest = pd.DataFrame() if df.shape[0] > 10: # len(df) &
i、 e.
split_数据帧(df,2(如果>10))
没有特定的便利功能
您必须执行以下操作:
first_ten = pd.DataFrame()
rest = pd.DataFrame()
if df.shape[0] > 10: # len(df) > 10 would also work
first_ten = df[:10]
rest = df[10:]
如果满足条件,这将返回分割的数据帧,否则返回原始数据帧和
None
(然后需要单独处理)。请注意,这假设每个df
只需进行一次拆分,并且拆分的第二部分(如果超过10行(意味着原始部分超过20行))正常
注意:您也可以使用df.head(10)
和df.tail(len(df)-10)
根据您的需要获取正面和背面。您还可以使用各种索引方法:如果需要,您可以只提供第一个维度索引,例如df[:10]
,而不是df[:10,:]
(尽管我喜欢明确地编码您所采用的维度)。您还可以使用df.iloc
和df.ix
以类似的方式进行索引
但是,请小心使用df.loc
,因为.loc
只有在索引标签恰好是从0开始的整数且没有间隙时才会“意外”起作用
但您也应该考虑熊猫提供的各种选项,将数据文件的内容倾倒到HTML中,也可能是胶乳,以便为演示文稿提供更好的设计表(而不是仅仅复制和粘贴)。只要用谷歌搜索如何将数据框转换为这些格式,就可以找到大量的教程和建议。您可以使用数据框的head和tail方法作为语法糖,而不是在这里进行切片/loc。我使用的分割大小为3;例如,使用headSize=10
def split(df, headSize) :
hd = df.head(headSize)
tl = df.tail(len(df)-headSize)
return hd, tl
df = pd.DataFrame({ 'A':[2,4,6,8,10,2,4,6,8,10],
'B':[10,-10,0,20,-10,10,-10,0,20,-10],
'C':[4,12,8,0,0,4,12,8,0,0],
'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})
# Split dataframe into top 3 rows (first) and the rest (second)
first, second = split(df, 3)
如果您有一个较大的数据帧,并且需要划分为数量可变的子数据帧行,例如,每个子数据帧最多有4500行,此脚本可以帮助您:
max_rows = 4500
dataframes = []
while len(df) > max_rows:
top = df[:max_rows]
dataframes.append(top)
df = df[max_rows:]
else:
dataframes.append(df)
然后可以保存这些数据帧:
for _, frame in enumerate(dataframes):
frame.to_csv(str(_)+'.csv', index=False)
希望这对别人有帮助 一种基于
np.split
的方法:
df = pd.DataFrame({ 'A':[2,4,6,8,10,2,4,6,8,10],
'B':[10,-10,0,20,-10,10,-10,0,20,-10],
'C':[4,12,8,0,0,4,12,8,0,0],
'D':[9,10,0,1,3,np.nan,np.nan,np.nan,np.nan,np.nan]})
listOfDfs = [df.loc[idx] for idx in np.split(df.index,5)]
使用模的小函数可以处理拆分不均匀的情况(例如np.split(df.index,4)
将抛出错误)
(是的,我知道原来的问题比这个问题更具体。不过,这应该可以回答标题中的问题。)下面是一个简单的函数实现,它将数据帧拆分为块和一些代码示例:
import pandas as pd
def split_dataframe_to_chunks(df, n):
df_len = len(df)
count = 0
dfs = []
while True:
if count > df_len-1:
break
start = count
count += n
#print("%s : %s" % (start, count))
dfs.append(df.iloc[start : count])
return dfs
# Create a DataFrame with 10 rows
df = pd.DataFrame([i for i in range(10)])
# Split the DataFrame to chunks of maximum size 2
split_df_to_chunks_of_2 = split_dataframe_to_chunks(df, 2)
print([len(i) for i in split_df_to_chunks_of_2])
# prints: [2, 2, 2, 2, 2]
# Split the DataFrame to chunks of maximum size 3
split_df_to_chunks_of_3 = split_dataframe_to_chunks(df, 3)
print([len(i) for i in split_df_to_chunks_of_3])
# prints [3, 3, 3, 1]
我使用了一个工具将一个巨大的数据帧切割成10万块:
size = 100000
list_of_dfs = [df.loc[i:i+size-1,:] for i in range(0, len(df),size)]
或作为发电机:
list_of_dfs = (df.loc[i:i+size-1,:] for i in range(0, len(df),size))
基于列表理解和
groupby
的方法,该方法将所有拆分的数据帧存储在一个列表变量中,并可使用索引进行访问
例如:
ans = [pd.DataFrame(y) for x, y in DF.groupby('column_name', as_index=False)]***
ans[0]
ans[0].column_name
我正在构建一个PowerPoint幻灯片,并将数据从df粘贴到每张幻灯片上的图表中,超过10行的图表将变得不可读。df[:10]工作正常,但当我尝试df[:10,:]时,我遇到了以下错误:TypeError:unhashabletype@LuisRamonRamirezRodriguez这听起来像是一个与这个问题无关的错误,您应该发布一个新问题,说明您正在使用的数据框是如何创建的,以及其中的一些数据是什么样子的。@LuisRamonRamirezRodriguez:use df.loc[:10,:]instead@nbeuchat这实际上不是一个好建议。是一种基于标签的索引,因此传递给它的内容永远不会解释为整数位置。只有当索引标签恰好是一个从0开始的无间隙整数范围时,这才会“意外”起作用。相反,如果小心地强制执行整数位置行为,则最好使用
iloc
,也可能使用.ix
。因为常规的getitem
语法已经可以这样做了,所以它没问题。我喜欢这个解决方案。但是,我认为您需要“df.iloc[I:I+size]”,否则每个块会缺少一行,而且它可以处理非整数索引。@Scottalbert:不,这很好,不需要更改为I+size。与列表的子集不同,In.loc和etcone行都是包含的。。爱死它了!
ans = [pd.DataFrame(y) for x, y in DF.groupby('column_name', as_index=False)]***
ans[0]
ans[0].column_name
def split_and_save_df(df, name, size, output_dir):
"""
Split a df and save each chunk in a different csv file.
Parameters:
df : pandas df to be splitted
name : name to give to the output file
size : chunk size
output_dir : directory where to write the divided df
"""
import os
for i in range(0, df.shape[0],size):
start = i
end = min(i+size-1, df.shape[0])
subset = df.loc[start:end]
output_path = os.path.join(output_dir,f"{name}_{start}_{end}.csv")
print(f"Going to write into {output_path}")
subset.to_csv(output_path)
output_size = os.stat(output_path).st_size
print(f"Wrote {output_size} bytes")