我有一个很大的时序数据帧。我想编写一个函数,将这个大数据框作为新数据框任意分割为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
请让我知道是否需要在任何方面进行说明。感谢您的时间!
答案 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次。