Eu tenho um grande dataframe com 423244 linhas. Eu quero dividir isso em 4. Tentei o código a seguir, mas deu um erro?ValueError: array split does not result in an equal division
for item in np.split(df, 4):
print item
Como dividir esse dataframe em 4 grupos?
np.split(df, N)
função, por favor.Respostas:
Use
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]
fonte
array_split
retorna uma lista de DataFrames, então você pode simplesmente percorrer a lista ...AttributeError: 'DataFrame' object has no attribute 'size'
Eu queria fazer o mesmo e, primeiro, tive problemas com a função de divisão, depois problemas com a instalação do pandas 0.15.2, então voltei para minha versão anterior e escrevi uma pequena função que funciona muito bem. Espero que isso possa ajudar!
# input - df: a Dataframe, chunkSize: the chunk size # output - a list of DataFrame # purpose - splits the DataFrame into smaller chunks def split_dataframe(df, chunk_size = 10000): chunks = list() num_chunks = len(df) // chunk_size + 1 for i in range(num_chunks): chunks.append(df[i*chunk_size:(i+1)*chunk_size]) return chunks
fonte
Acho que agora podemos usar o plano
iloc
comrange
para isso.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) ....
fonte
Esteja ciente de que
np.array_split(df, 3)
divide o dataframe em 3 sub-dataframes, enquanto asplit_dataframe
função definida na resposta desplit_dataframe(df, chunk_size=3)
@elixir , quando chamada como , divide o dataframe a cadachunk_size
linha.Exemplo:
Com
np.array_split
:df = pd.DataFrame([1,2,3,4,5,6,7,8,9,10,11], columns=['TEST']) df_split = np.array_split(df, 3)
... você obtém 3 subframes de dados:
df_split[0] # 1, 2, 3, 4 df_split[1] # 5, 6, 7, 8 df_split[2] # 9, 10, 11
Com
split_dataframe
:df_split2 = split_dataframe(df, chunk_size=3)
... você obtém 4 subframes de dados:
df_split2[0] # 1, 2, 3 df_split2[1] # 4, 5, 6 df_split2[2] # 7, 8, 9 df_split2[3] # 10, 11
Espero que eu esteja certo e que isso seja útil.
fonte
Cuidado:
np.array_split
não funciona com numpy-1.9.0. Eu verifiquei: Funciona com 1.8.1.Erro:
fonte
Você pode usar
groupby
, supondo que tenha um índice enumerado de número inteiro: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)]
Nota:
groupby
retorna uma tupla na qual o segundo elemento é o dataframe, portanto, a extração um pouco complicada.>>> len(subframes), [len(i) for i in subframes] (4, [25, 25, 25, 24])
fonte
Também percebi que o np.array_split não funcionava com o Pandas DataFrame, minha solução foi apenas dividir o índice do DataFrame e, em seguida, introduzir uma nova coluna com o rótulo "grupo":
indexes = np.array_split(df.index,N, axis=0) for i,index in enumerate(indexes): df.loc[index,'group'] = i
Isso torna as operações de agrupamento muito convenientes para o cálculo de exemplo do valor médio de cada grupo:
df.groupby(by='group').mean()
fonte
você pode usar as compreensões de lista para fazer isso em uma única linha
n = 4 chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]
fonte