如果pandas dataframe行数超过10则分成两部分

48 投票
9 回答
137003 浏览
提问于 2025-04-18 17:10

我有一个很大的CSV文件,里面有很多表格和很多行数据。我想把每个数据表分成两个,如果它的行数超过10行的话。

如果是这样的话,我希望第一个数据表包含前10行,剩下的行放在第二个数据表里。

有没有什么方便的函数可以做到这一点?我找了很久,但没有找到有用的东西……

比如说 split_dataframe(df, 2(if > 10))

9 个回答

4

下面是一个简单的函数实现,它可以把一个数据表(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]
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)]

有一个小函数可以使用取余运算,来处理那些不能平均分割的情况(比如 np.split(df.index,4) 会出错)。

(是的,我知道原始问题比这更具体。不过,这里是为了回答标题中的问题。)

21

没有专门的方便函数。

你需要做一些类似这样的事情:

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:]
46

我使用了一个叫做列表推导式的方法,把一个很大的数据表分成了每块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))
28

如果条件满足,这段代码会返回分开的数据框(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,因为它是基于标签的,输入永远不会被解释为整数位置。只有在你恰好有从0开始且没有间隔的整数索引标签时,.loc才会“意外”工作。

此外,你还应该考虑pandas提供的各种选项,可以将数据框的内容导出为HTML,甚至是LaTeX,这样可以制作更好看的表格用于展示(而不是简单地复制粘贴)。只需在网上搜索如何将数据框转换为这些格式,就能找到很多相关的教程和建议,正好适合这个需求。

撰写回答