একটি বড় পান্ডাস ডেটা ফ্রেম বিভক্ত করুন


92

আমার কাছে 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)দয়া করে একটি ফাংশন চাই ।
সেরেন

উত্তর:


194

ব্যবহার 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]

8
@ নীলানিআলগিরিয়াজ - ডেটা ফ্রেমগুলির array_splitএকটি তালিকা ফেরত দেয়, যাতে আপনি কেবল তালিকাটির মধ্য দিয়ে লুপ করতে পারেন ...
রুট

4
ডেটাফ্রেমের কোনও 'আকার' না থাকায় আপনি কীভাবে কোনও অ্যাট্রিবিউটআরার পাবেন না।
বুস্টেড_ড 16

4
এই উত্তরটি পুরানো:AttributeError: 'DataFrame' object has no attribute 'size'
তেজরিরিমুরি

4
উত্তর দুর্দান্ত কাজ করে! ভারী গণনা করার সময় ডেটা ফ্রেমের কিছু অংশকে ফাঁকা করার জন্য খুব আঁটসাঁট এবং সংক্ষিপ্ত (যেমন পাইথোনিক)
ওপেনওনক

4
আশ্চর্যজনক সরল! ধন্যবাদ
ভিভ

37

আমিও একই কাজ করতে চেয়েছিলাম, এবং আমার প্রথম বিভক্ত ফাংশন নিয়ে সমস্যা ছিল, তারপরে পান্ডাস ইনস্টল করতে সমস্যা হয়েছিল 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

6
np.array_split ()
jgaw

6
সংখ্যার গণনা করার সঠিক উপায় শঙ্কস আমদানি করুন গণিত সংখ্যাচঙ্কস = ম্যাথ.সিল (লেন (ডিএফ) / চঙ্কসাইজ)
সের্গেই লেইকো

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)
    ....

4
সহজ এবং স্বজ্ঞাত
rmstmppr

15

সাবধান থাকুন যে 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

আশা করি আমি ঠিক আছি, এবং এটি দরকারী।


এই প্রক্রিয়াটিকে এলোমেলো করার কোনও সহজ উপায় আছে। আমি কেবল রোনডম কলাম যুক্ত করার কথা ভাবতে পারি, এলোমেলো করে এবং এলোমেলো কলামটি সরিয়ে ফেলতে পারি তবে এর থেকে সহজ উপায় হতে পারে
রাটার হাফস্টে

তাদের কি সমান মাপের আকার হতে হবে?
ইনকুইলাইনকিয়ার

8

সতর্ক করা:

np.array_splitনপি -১.৯.০ নিয়ে কাজ করে না। আমি চেক আউট করেছি: এটি 1.8.1 এর সাথে কাজ করে।

ত্রুটি:

ডেটাফ্রেমের কোনও 'আকার' বৈশিষ্ট্য নেই


7
আমি পান্ডাস গিথুবে একটি বাগ দায়ের করেছি: github.com/pydata/pandas/issues/8846 মনে হচ্ছে এটি ইতিমধ্যে পান্ডার জন্য ঠিক করা হয়েছে 0.15.2
ইয়ামু

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

আমি এনপি.আরএ_স্প্লিটকেও পান্ডাস ডেটা ফ্রেমের সাথে কাজ না করার অভিজ্ঞতা পেয়েছি আমার সমাধানটি হ'ল কেবল ডাটাফ্রেমের সূচি বিভক্ত করা এবং তারপরে "গ্রুপ" লেবেলের সাথে একটি নতুন কলাম প্রবর্তন করা:

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()

1

আপনি একক লাইনে এটি করতে তালিকা বোধগম্য ব্যবহার করতে পারেন

n = 4
chunks = [df[i:i+n] for i in range(0,df.shape[0],n)]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.