it-swarm.com.de

Teilen Sie einen großen pandas dataframe

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 diesen Datenrahmen in 4 Gruppen auf?

41

Verwenden 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]
107
root

Ich wollte dasselbe machen 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 funktioniert sehr gut, 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
17
elixir

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 Sub-Datenrahmen:

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 Sub-Datenrahmen:

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.

8
Gilberto

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 Größenattribut

8
yemu

Ich denke jetzt können wir iloc mit range 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)
    ....
4
pratpor

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