首页 文章

Pandas:按行数将数据帧拆分为多个数据帧

提问于
浏览
19

对熊猫来说相当新鲜所以忍受我...

我有一个巨大的csv,有很多行的表 . 我想简单地将每个数据帧拆分为2,如果它包含超过10行 .

如果为true,我希望第一个数据帧包含前10个数据帧,其余数据帧包含第二个数据帧 .

这有一个方便的功能吗?我环顾四周但发现没什么用处......

即split_dataframe(df,2(if> 10))?

6 回答

  • 1

    如果满足条件,这将返回拆分的DataFrame,否则返回原始和 None (然后您需要单独处理) . 请注意,这假设分割只需要每 df 发生一次,并且拆分的第二部分(如果它超过10行(意味着原始长度超过20行))就可以了 .

    df_new1, df_new2 = df[:10, :], df[10:, :] if len(df) > 10 else df, None
    

    请注意,您也可以根据需要使用 df.head(10)df.tail(len(df) - 10) 来获取正面和背面 . 您还可以使用各种索引方法:您可以根据需要提供第一个维度索引,例如 df[:10] 而不是 df[:10, :] (尽管我喜欢明确地编写关于您正在使用的维度的代码) . 您也可以使用 df.ilocdf.ix 以类似的方式进行索引 .

    但请注意使用 df.loc ,因为it is label-based and the input will never be interpreted as an integer position . .loc 只会在您碰巧具有从0开始且没有间隙的整数的索引标签时才起作用"accidentally" .

    但是您还应该考虑pandas提供的各种选项,用于将DataFrame的内容转储为HTML,还可能考虑LaTeX,以便为演示文稿制作更好的表格(而不仅仅是复制和粘贴) . 简单地谷歌搜索如何将DataFrame转换为这些格式,为这个应用程序提供了大量的教程和建议 .

  • 0

    没有特定的便利功能 .

    你必须做的事情如下:

    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:]
    
  • 14

    你可以使用DataFrame 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)
    
  • 0

    下面是一个简单的函数实现,它将DataFrame拆分为块和一些代码示例:

    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]
    
  • 12

    如果您有一个大型数据框并需要划分为可变数量的子数据帧行,例如每个子数据帧最多有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)
    

    希望这有助于某人!

  • 1

    一种基于 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) 将引发错误) .

    (是的,我知道原来的问题比这更具体 . 但是,这应该回答 Headers 中的问题 . )

相关问题