Ich habe einen großen Datenrahmen mit 423244 Zeilen. Ich möchte dies in 4 aufteilen. Ich habe den folgenden Code ausprobiert, der einen Fehler ergab.ValueError: array split does not result in an equal division
for item in np.split(df, 4):
print item
Wie kann man diesen Datenrahmen in 4 Gruppen aufteilen?
np.split(df, N)
bitte eine Funktion.Antworten:
Verwendung
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]
quelle
array_split
gibt eine Liste von DataFrames zurück, so dass Sie einfach die Liste durchlaufen können ...AttributeError: 'DataFrame' object has no attribute 'size'
Ich wollte dasselbe tun und hatte zuerst Probleme mit der Split-Funktion, dann Probleme mit der Installation von Pandas 0.15.2. Also ging ich zurück zu meiner alten Version und schrieb eine kleine Funktion, die sehr gut funktioniert. Ich hoffe das kann helfen!
# 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
quelle
Ich denke , jetzt können wir schlicht verwenden
iloc
mitrange
dafür.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) ....
quelle
np.array_split(df, 3)
Beachten Sie, dass der Datenrahmen in drei Unterdatenrahmen aufgeteilt wird, während diesplit_dataframe
in der Antwort von @ elixir definierte Funktion beim Aufrufen alssplit_dataframe(df, chunk_size=3)
den Datenrahmen allechunk_size
Zeilen aufteilt .Beispiel:
Mit
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)
... Sie erhalten 3 Unterdatenrahmen:
df_split[0] # 1, 2, 3, 4 df_split[1] # 5, 6, 7, 8 df_split[2] # 9, 10, 11
Mit
split_dataframe
:df_split2 = split_dataframe(df, chunk_size=3)
... Sie erhalten 4 Unterdatenrahmen:
df_split2[0] # 1, 2, 3 df_split2[1] # 4, 5, 6 df_split2[2] # 7, 8, 9 df_split2[3] # 10, 11
Hoffe ich habe recht und das ist nützlich.
quelle
Vorsicht:
np.array_split
funktioniert nicht mit numpy-1.9.0. Ich habe ausgecheckt: Es funktioniert mit 1.8.1.Error:
quelle
Sie können
groupby
Folgendes verwenden , vorausgesetzt, Sie haben einen ganzzahligen Index: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)]
Hinweis:
groupby
Gibt ein Tupel zurück, in dem das 2. Element der Datenrahmen ist, daher die etwas komplizierte Extraktion.>>> len(subframes), [len(i) for i in subframes] (4, [25, 25, 25, 24])
quelle
Ich habe auch festgestellt, dass np.array_split nicht mit Pandas DataFrame funktioniert. Meine Lösung bestand darin, nur den Index des DataFrame zu teilen und dann eine neue Spalte mit der Bezeichnung "group" einzuführen:
indexes = np.array_split(df.index,N, axis=0) for i,index in enumerate(indexes): df.loc[index,'group'] = i
Dies macht groubige Operationen sehr bequem, zum Beispiel die Berechnung des Mittelwerts jeder Gruppe:
df.groupby(by='group').mean()
quelle
Sie können Listenverständnisse verwenden, um dies in einer einzelnen Zeile zu tun
n = 4 chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]
quelle