我有一个包含423244行的大型数据帧。我想将其拆分为4.我尝试了下面的代码,它给出了一个错误? ValueError: array split does not result in an equal division
for item in np.split(df, 4):
print item
如何将此数据框拆分为4组?
答案 0 :(得分:99)
使用np.array_split
:
Docstring:
Split an array into multiple sub-arrays.
Please refer to the ``split`` documentation. The only difference
between these functions is that ``array_split`` allows
`indices_or_sections` to be an integer that does *not* equally
divide the axis.
In [1]: import pandas as pd
In [2]: df = pd.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar',
...: 'foo', 'bar', 'foo', 'foo'],
...: 'B' : ['one', 'one', 'two', 'three',
...: 'two', 'two', 'one', 'three'],
...: 'C' : randn(8), 'D' : randn(8)})
In [3]: print df
A B C D
0 foo one -0.174067 -0.608579
1 bar one -0.860386 -1.210518
2 foo two 0.614102 1.689837
3 bar three -0.284792 -1.071160
4 foo two 0.843610 0.803712
5 bar two -1.514722 0.870861
6 foo one 0.131529 -0.968151
7 foo three -1.002946 -0.257468
In [4]: import numpy as np
In [5]: np.array_split(df, 3)
Out[5]:
[ A B C D
0 foo one -0.174067 -0.608579
1 bar one -0.860386 -1.210518
2 foo two 0.614102 1.689837,
A B C D
3 bar three -0.284792 -1.071160
4 foo two 0.843610 0.803712
5 bar two -1.514722 0.870861,
A B C D
6 foo one 0.131529 -0.968151
7 foo three -1.002946 -0.257468]
答案 1 :(得分:16)
我想做同样的事情,我首先遇到分裂问题,然后安装pandas 0.15.2的问题,所以我回到了我的旧版本,写了一个功能很好的小功能。我希望这可以帮助你!
# input - df: a Dataframe, chunkSize: the chunk size
# output - a list of DataFrame
# purpose - splits the DataFrame into smaller of max size chunkSize (last is smaller)
def splitDataFrameIntoSmaller(df, chunkSize = 10000):
listOfDf = list()
numberChunks = len(df) // chunkSize + 1
for i in range(numberChunks):
listOfDf.append(df[i*chunkSize:(i+1)*chunkSize])
return listOfDf
答案 2 :(得分:8)
请注意np.array_split(df, 3)
将数据帧拆分为3个子数据帧,而splitDataFrameIntoSmaller(df, chunkSize = 3)
每隔chunkSize
行拆分数据帧。
示例:
df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10,11], columns=['TEST'])
df_split = np.array_split(df, 3)
您将获得3个子数据帧:
df_split[0] # 1, 2, 3, 4
df_split[1] # 5, 6, 7, 8
df_split[2] # 9, 10, 11
使用:
df_split2 = splitDataFrameIntoSmaller(df, chunkSize = 3)
您将获得4个子数据帧:
df_split2[0] # 1, 2, 3
df_split2[1] # 4, 5, 6
df_split2[2] # 7, 8, 9
df_split2[3] # 10, 11
希望我是对的,希望这很有用。
答案 3 :(得分:7)
注意:
np.array_split
无法使用numpy-1.9.0。我检查了:它适用于1.8.1。
错误:强>
数据框没有'大小'属性
答案 4 :(得分:4)
我想现在我们可以使用普通iloc
和range
进行此操作。
chunk_size = int(df.shape[0] / 4)
for start in range(0, df.shape[0], chunk_size):
df_subset = df.iloc[start:start + chunk_size]
process_data(df_subset)
....
答案 5 :(得分:3)
您可以使用groupby
,假设您有一个整数枚举索引:
import math
df = pd.DataFrame(dict(sample=np.arange(99)))
rows_per_subframe = math.ceil(len(df) / 4.)
subframes = [i[1] for i in df.groupby(np.arange(len(df))//rows_per_subframe)]
注意:groupby
返回一个元组,其中第二个元素是数据帧,因此提取稍微复杂。
>>> len(subframes), [len(i) for i in subframes]
(4, [25, 25, 25, 24])
答案 6 :(得分:1)
我还遇到了np.array_split无法与Pandas DataFrame一起使用的问题,我的解决方案是仅拆分DataFrame的索引,然后引入带有“组”标签的新列:
indexes = np.array_split(df.index,N, axis=0)
for i,index in enumerate(indexes):
df.loc[index,'group'] = i
这使得grouby运算非常便于实例计算每个组的平均值:
df.groupby(by='group').mean()
答案 7 :(得分:1)
您可以使用列表推导功能在一行中完成
n = 4
chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]