Pandas:按行数将数据帧拆分为多个数据帧
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Pandas:按行数将数据帧拆分为多个数据帧相关的知识,希望对你有一定的参考价值。
对熊猫来说相当新鲜所以忍受我...
我有一个巨大的csv,有很多行的表。我想简单地将每个数据帧拆分为2,如果它包含超过10行。
如果为true,我希望第一个数据帧包含前10个数据帧,其余数据帧包含第二个数据帧。
这有一个方便的功能吗?我环顾四周但发现没什么用处......
即split_dataframe(df,2(if> 10))?
如果满足条件,这将返回拆分的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
开始,请注意使用it is label-based and the input will never be interpreted as an integer position。 .loc
只会在你碰巧有一个从0开始没有间隙的整数的索引标签的情况下“偶然”工作。
但是您还应该考虑pandas提供的各种选项,用于将DataFrame的内容转储为html,还可能考虑LaTeX,以便为演示文稿制作更好的表格(而不仅仅是复制和粘贴)。简单地谷歌搜索如何将DataFrame转换为这些格式,为这个应用程序提供了大量的教程和建议。
没有特定的便利功能。
你必须做的事情如下:
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:]
一种基于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)
会抛出错误)。
(是的,我知道原来的问题比这更具体。但是,这应该回答标题中的问题。)
我使用这个List Comprehensions将一个巨大的df切成100'000的块:
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 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)
下面是一个简单的函数实现,它将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]
如果您有一个大型数据框并需要划分为可变数量的子数据帧行,例如每个子数据帧最多有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)
希望这有助于某人!
基于列表推导和groupby
的方法,它将所有拆分数据帧存储在列表变量中,并且可以使用索引进行访问。
例:
ans = [pd.DataFrame(y) for x, y in DF.groupby('column_name', as_index=False)]***
ans[0]
ans[0].column_name
以上是关于Pandas:按行数将数据帧拆分为多个数据帧的主要内容,如果未能解决你的问题,请参考以下文章
将多个键上的 pandas 数据帧映射为列或 multiIndex