如果pandas dataframe行数超过10则分成两部分
我有一个很大的CSV文件,里面有很多表格和很多行数据。我想把每个数据表分成两个,如果它的行数超过10行的话。
如果是这样的话,我希望第一个数据表包含前10行,剩下的行放在第二个数据表里。
有没有什么方便的函数可以做到这一点?我找了很久,但没有找到有用的东西……
比如说 split_dataframe(df, 2(if > 10))
?
9 个回答
下面是一个简单的函数实现,它可以把一个数据表(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]
这里介绍了一种基于 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)
会出错)。
(是的,我知道原始问题比这更具体。不过,这里是为了回答标题中的问题。)
没有专门的方便函数。
你需要做一些类似这样的事情:
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:]
我使用了一个叫做列表推导式的方法,把一个很大的数据表分成了每块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))
如果条件满足,这段代码会返回分开的数据框(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.iloc
和df.ix
以类似的方式进行索引。
不过要小心使用df.loc
,因为它是基于标签的,输入永远不会被解释为整数位置。只有在你恰好有从0开始且没有间隔的整数索引标签时,.loc
才会“意外”工作。
此外,你还应该考虑pandas提供的各种选项,可以将数据框的内容导出为HTML,甚至是LaTeX,这样可以制作更好看的表格用于展示(而不是简单地复制粘贴)。只需在网上搜索如何将数据框转换为这些格式,就能找到很多相关的教程和建议,正好适合这个需求。