Python 如果数据帧的行数超过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) &

我有一个巨大的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) > 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")