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 teile ich den Datenrahmen in 4 Gruppen auf?

95
Nilani Algiriyage 26 Juni 2013 im 13:01

6 Antworten

Beste Antwort

Verwenden Sie 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]
137
mithunpaul 28 Nov. 2017 im 22:03

Beachten Sie, dass np.array_split(df, 3) den Datenrahmen in 3 Unterdatenrahmen aufteilt, während splitDataFrameIntoSmaller(df, chunkSize = 3) den Datenrahmen alle chunkSize Zeilen aufteilt.

Beispiel:

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:

df_split2 = splitDataFrameIntoSmaller(df, chunkSize = 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, hoffe das ist nützlich.

11
Gilberto 12 Juli 2017 im 10:06

Sie können groupby 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, also die etwas komplizierte Extraktion.

>>> len(subframes), [len(i) for i in subframes]
(4, [25, 25, 25, 24])
4
rumpel 21 Sept. 2017 im 20:40

Vorsicht:

np.array_split funktioniert nicht mit numpy-1.9.0. Ich habe ausgecheckt: Es funktioniert mit 1.8.1.

Fehler:

Der Datenrahmen hat kein Attribut "Größe"

8
Fruchtzwerg 13 Jän. 2017 im 08:47

Ich denke jetzt können wir einfach iloc mit range dafür verwenden.

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)
    ....
7
pratpor 21 März 2018 im 20:22

Ich wollte dasselbe tun und hatte zuerst Probleme mit der geteilten 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 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
21
elixir 5 März 2015 im 15:49