我试图将具有周期数据的大数据帧拆分成具有相等或接近相等的周期长度的较小数据帧。 Array_split工作得很好,直到我的数据不允许相等的分割(500,000个循环工作正常,但不是1,190,508)。我希望这些部分以1000个周期为增量(最后一帧除外)。
以下是该方案:
d = {
'a': pd.Series(random(1190508)),
'b': pd.Series(random(1190508)),
'c': pd.Series(random(1190508)),
}
frame = pd.DataFrame(d)
cycles = 1000
sections = math.ceil(len(frame)/cycles)
split_frames = np.array_split(frame, sections)
文档显示array_split基本上可以分割偶数组,然后在最后组成较小的组,因为数据不能均匀分割。这就是我想要的,但是目前,如果我查看这个新split_frames list
中每个帧的长度:
split_len = pd.DataFrame([len(a) for a in split_frame])
split_len.to_csv('lengths.csv')
前698帧的长度为1000个元素,但其余(帧699到1190)的长度为999个元素。
无论我为sections
传递的数字(舍入,偶数,或其他任何数字),似乎都会使这个随机发生的中断长度。
我很难理解为什么它没有创建相同的帧长度,除了文档中的最后一帧:
>>> x = np.arange(8.0)
>>> np.array_split(x, 3)
[array([ 0., 1., 2.]), array([ 3., 4., 5.]), array([ 6., 7.])]
感谢任何帮助,谢谢!
答案 0 :(得分:4)
array_split
没有制作一些相等的部分和一个剩余部分。如果将长度为l
的数组拆分为n
个部分,则会生成l % n
个大小为l//n + 1
的部分,其余部分的大小为l//n
。有关详细信息,请参阅the source。 (这确实应该在文档中解释。)
答案 1 :(得分:3)
正如@ user2357112写的那样,array_split
没有做你认为它做的事情......但是通过查看文档,无论如何都很难知道它是做什么的。事实上,我说它的行为是 undefined 。我们希望它能够返回某些东西,但我们不知道某些东西会有什么属性。
为了得到你想要的东西,我使用numpy.split
提供自定义索引的能力。所以,例如:
def greedy_split(arr, n, axis=0):
"""Greedily splits an array into n blocks.
Splits array arr along axis into n blocks such that:
- blocks 1 through n-1 are all the same size
- the sum of all block sizes is equal to arr.shape[axis]
- the last block is nonempty, and not bigger than the other blocks
Intuitively, this "greedily" splits the array along the axis by making
the first blocks as big as possible, then putting the leftovers in the
last block.
"""
length = arr.shape[axis]
# compute the size of each of the first n-1 blocks
block_size = np.ceil(length / float(n))
# the indices at which the splits will occur
ix = np.arange(block_size, length, block_size)
return np.split(arr, ix, axis)
一些例子:
>>> x = np.arange(10)
>>> greedy_split(x, 2)
[array([0, 1, 2, 3, 4]), array([5, 6, 7, 8, 9])]
>>> greedy_split(x, 3)
[array([0, 1, 2, 3]), array([4, 5, 6, 7]), array([8, 9])]
>>> greedy_split(x, 4)
[array([0, 1, 2]), array([3, 4, 5]), array([6, 7, 8]), array([9])]
答案 2 :(得分:0)
其他人解释的一个简单例子:
In [21]: [len(x)for x in np.array_split(np.arange(1000),12)]
Out[21]: [84, 84, 84, 84, 83, 83, 83, 83, 83, 83, 83, 83]
答案 3 :(得分:-1)
如何访问每个拆分的结果
x = np.arange(8.0)
y = np.array_split(x,3) [array([0.,1.,2。]),array([3.,4.,5。]),array([6.,7。])]
如何得到y(1),y(2),y(3)