एक बड़े पांडा डेटाफ्रेम को विभाजित करें


86

मेरे पास 423244 लाइनों के साथ एक बड़ी डेटाफ्रेम है। मैं इसे 4 में विभाजित करना चाहता हूं। मैंने निम्नलिखित कोड की कोशिश की जिसमें त्रुटि हुई?ValueError: array split does not result in an equal division

for item in np.split(df, 4):
    print item

इस डेटाफ्रेम को 4 समूहों में कैसे विभाजित करें?


हमें एक np.split(df, N)फंक्शन चाहिए।
सोरेन

जवाबों:


182

उपयोग करें 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]

बहुत बहुत धन्यवाद! इसके अलावा मैं प्रत्येक समूह के लिए कुछ फ़ंक्शन लागू करना चाहता हूं? समूहों को एक-एक करके कैसे एक्सेस करें?
निलानी अलगीरियेज

7
@ नीलानीगिरिअएज - डेटाफ्रेम की array_splitएक सूची देता है, इसलिए आप सूची के माध्यम से सिर्फ लूप कर सकते हैं ...
रूट

मैं डेटाफ्रेम को विभाजित कर रहा हूं क्योंकि यह बहुत बड़ा है। मैं पहले समूह को लेना चाहता हूं और फ़ंक्शन को लागू करना चाहता हूं, फिर दूसरे समूह को लागू करता हूं और फ़ंक्शन आदि को लागू करता हूं, इसलिए मैं प्रत्येक समूह तक कैसे पहुंच सकता हूं?
निलानी अल्जीरियेज

1
कैसे आपको एक एट्रीब्यूट नहीं मिलता क्योंकि डेटाफ्रेम का कोई 'आकार' नहीं है।
बूस्ट_ड 16

2
यह उत्तर पुराना है:AttributeError: 'DataFrame' object has no attribute 'size'
Tjorriemorrie

33

मैं ऐसा ही करना चाहता था, और मुझे पहले फूट फंक्शन की समस्या थी, फिर पंडों को 0.15.2 स्थापित करने में समस्या थी, इसलिए मैं अपने पुराने संस्करण में वापस चला गया, और एक छोटा सा फंक्शन लिखा, जो बहुत अच्छा काम करता है। मुझे आशा है कि यह मदद कर सकता है!

# 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

5
np.array_split ()
jgaw

4
नंबर गणना करने का सही तरीका आयात गणित संख्याएंहॉक = math.ceil (len (df) / chunkSize)
सर्गेई लेको

21

मुझे लगता है कि अब हम इसके 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)
    ....

1
सरल और सहज
rmstmppr

13

ध्यान रखें कि np.array_split(df, 3)डेटाफ़्रेम को 3 उप-डेटाफ़्रेम में विभाजित करता है, जबकि @ अमृत के उत्तरsplit_dataframe में परिभाषित फ़ंक्शन , जब कहा जाता है , डेटाफ़्रेम को हर पंक्तियों में विभाजित करता है ।split_dataframe(df, chunk_size=3)chunk_size

उदाहरण:

के साथ 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)

... आपको 3 उप-डेटाफ़्रेम मिलते हैं:

df_split[0] # 1, 2, 3, 4
df_split[1] # 5, 6, 7, 8
df_split[2] # 9, 10, 11

के साथ split_dataframe:

df_split2 = split_dataframe(df, chunk_size=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

आशा है कि मैं सही हूँ, और यह उपयोगी है।


इस प्रक्रिया को यादृच्छिक बनाने का एक आसान तरीका है। मैं केवल एक रोंडोम कॉलम जोड़ने, बंटवारे और यादृच्छिक कॉलम को हटाने के बारे में सोच सकता हूं, लेकिन एक आसान तरीका हो सकता है
रटगेर हॉस्टेस्ट

क्या उन्हें समान चंक आकार होना चाहिए?
inquilineKea

8

सावधान:

np.array_splitसुन्न-1.9.0 के साथ काम नहीं करता है। मैंने जाँच की: यह 1.8.1 के साथ काम करता है।

त्रुटि:

डेटाफ़्रेम में कोई 'आकार' विशेषता नहीं है


6
मैंने पांडा में एक बग दर्ज किया github: github.com/pydata/pandas/issues/8846 लगता है कि यह पहले से ही पांडा के लिए 0.15.2 तय है
yemu

4

आप 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])

1

मुझे यह भी अनुभव हुआ कि np.array_split पंडों के साथ काम नहीं कर रहा है DataFrame मेरा समाधान केवल DataFrame के सूचकांक को विभाजित करना था और फिर "समूह" लेबल के साथ एक नया कॉलम पेश करना था:

indexes = np.array_split(df.index,N, axis=0)
for i,index in enumerate(indexes):
   df.loc[index,'group'] = i

यह प्रत्येक समूह के औसत मूल्य की गणना के लिए बहुत सुविधाजनक संचालन करता है:

df.groupby(by='group').mean()

0

आप एक पंक्ति में ऐसा करने के लिए सूची समझ का उपयोग कर सकते हैं

n = 4
chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.