将大数据帧拆分为较小的相等数据帧

时间:2019-09-02 07:37:57

标签: pandas numpy dataframe split

我有一个很大的时序数据帧。我想编写一个函数,将这个大数据框作为新数据框任意分割为N个连续的子周期,以便可以轻松地对每个较小的数据框进行分析。

我有这行代码将大数据帧分成偶数子周期。我需要一个将输出这些拆分数据帧的函数。

np.array_split(df, n) #n = arbitrary amount of new dataframes

我希望将每个新数据帧的每个子周期标记为1,2,3,4,依此类推。因此,返回N个数据帧,这些数据帧均根据其初始大数据帧的时间特性进行了标记。

df before the function applied
 1    43.91 -0.041619
 2    43.39  0.011913
 3    45.56 -0.048801
 4    45.43  0.002857
 5    45.33  0.002204
 6    45.68 -0.007692
 7    46.37 -0.014992
 8    48.04 -0.035381
 9    48.38 -0.007053

3 new df's after function split applied 
df1
 1    43.91 -0.041619
 2    43.39  0.011913
 3    45.56 -0.048801
df2
 4    45.43  0.002857
 5    45.33  0.002204
 6    45.68 -0.007692
df3
 7    46.37 -0.014992
 8    48.04 -0.035381
 9    48.38 -0.007053

请让我知道是否需要在任何方面进行说明。感谢您的时间!

2 个答案:

答案 0 :(得分:1)

使用:

print (df)
       a         b
1  43.91 -0.041619
2  43.39  0.011913
3  45.56 -0.048801
4  45.43  0.002857
5  45.33  0.002204
6  45.68 -0.007692
7  46.37 -0.014992
8  48.04 -0.035381
9  48.38 -0.007053


def split(df, chunkSize = 30):
    return np.array_split(df, chunkSize)

可能,但recommended不可行:

for i, g in enumerate(split(df, 3), 1):
    globals()['df{}'.format(i)] =  g
print (df1)
       a         b
1  43.91 -0.041619
2  43.39  0.011913
3  45.56 -0.048801

最好通过索引选择每个DataFrame:

dfs = split(df, 3)
print (dfs[0])
       a         b
1  43.91 -0.041619
2  43.39  0.011913
3  45.56 -0.048801

也可以创建字典,但我认为这确实太复杂了:

def split1(df, chunkSize = 30):
    return {'df_{}'.format(i): g 
              for i, g in enumerate(np.array_split(df, chunkSize), 1)}

dfs = split1(df, 3)
print (dfs)
{'df_1':        a         b
1  43.91 -0.041619
2  43.39  0.011913
3  45.56 -0.048801, 'df_2':        a         b
4  45.43  0.002857
5  45.33  0.002204, 'df_3':        a         b
6  45.68 -0.007692
7  46.37 -0.014992, 'df_4':        a         b
8  48.04 -0.035381
9  48.38 -0.007053}

print (dfs['df_1'])
       a         b
1  43.91 -0.041619
2  43.39  0.011913
3  45.56 -0.048801

答案 1 :(得分:1)

从您的描述中我不知道您是否知道np.array_split输出n对象。如果只有几个对象,则可以手动分配它们,例如:

df1, df2, df3 = np.array_split(df, 3)

这将按顺序将每个子数组分配给这些变量。 否则,您可以将一系列子数组分配给单个变量;

split_df = np.array_split(df, 3)
len(split_df)
# 3

然后循环遍历此变量,并对每个子数组进行分析。我会亲自选择后者。

for object in split_df:
    print(type(object))

这将打印<class 'pandas.core.frame.DataFrame'> 3次。