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

Boo*_*d16 32 python split dataframe pandas

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

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

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

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

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

ely*_*ely 21

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

df_new1, df_new2 = df[:10, :], df[10:, :] if len(df) > 10 else df, None
Run Code Online (Sandbox Code Playgroud)

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

df.loc但是要小心使用,因为它是基于标签的,输入永远不会被解释为整数位置..loc只有当您碰巧有从0开始且没有间隙的整数的索引标签时才会"意外"工作.

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

  • @LuisRamonRamirezRodriguez:使用df.loc [:10,:]代替 (4认同)
  • @nbeuchat这实际上并不是一个好建议.[loc](http://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.loc.html)是故意基于*标签*的索引,所以传递给它的是*never*解释为整数位置.如果你的索引标签恰好是一个没有间隙的整数范围并且从0开始,这只会"意外"工作.相反,如果小心强制整数位置行为,则首选使用`iloc`,也可以使用`.ix`.由于常规`getitem`语法已经这样做了,这就是为什么它没问题. (4认同)

EdC*_*ica 14

没有特定的便利功能.

你必须做的事情如下:

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:]
Run Code Online (Sandbox Code Playgroud)

  • 很好,谢谢老兄。希望我能接受两个答案! (2认同)

agi*_*ius 10

我使用列表理解将一个巨大的DataFrame切成100'000的块:

size = 100000
list_of_dfs = [df.loc[i:i+size-1,:] for i in range(0, len(df),size)]
Run Code Online (Sandbox Code Playgroud)

或作为生成器:

list_of_dfs = (df.loc[i:i+size-1,:] for i in range(0, len(df),size))
Run Code Online (Sandbox Code Playgroud)

  • 我喜欢这个解决方案。但是,我认为您需要“df.iloc[i:i+size]”,否则每个块都会缺少一行,并且它也适用于非整数索引。 (3认同)
  • @ScottTalbert:不,这工作正常,不需要更改为 i+size。在 .loc 中,两者都是包含的,与列表的子集等不同 (2认同)

web*_*elo 6

基于的方法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)]
Run Code Online (Sandbox Code Playgroud)

一个使用模的小函数可以处理分裂不均匀的情况(例如np.split(df.index,4)会抛出错误)。

是的,我知道原始问题比这更具体。但是,这应该回答标题中的问题。