একটি ডেটা ফ্রেম তৈরির সঠিক উপায়
TLDR; (কেবল সাহসী পাঠ্য পড়ুন)
এখানে বেশিরভাগ উত্তরগুলি আপনাকে একটি খালি ডেটা ফ্রেম তৈরি এবং এটি পূরণ করার পদ্ধতি সম্পর্কে জানাবে, তবে কেউ আপনাকে বলবে না যে এটি করা খারাপ কাজ।
এখানে আমার পরামর্শ: আপনার কাজ করার জন্য প্রয়োজনীয় সমস্ত ডেটা আপনার কাছে নিশ্চিত না হওয়া পর্যন্ত অপেক্ষা করুন। আপনার ডেটা সংগ্রহ করার জন্য একটি তালিকা ব্যবহার করুন, তারপরে আপনি প্রস্তুত থাকাকালীন কোনও ডেটা ফ্রেম শুরু করুন।
data = []
for a, b, c in some_function_that_yields_data():
data.append([a, b, c])
df = pd.DataFrame(data, columns=['A', 'B', 'C'])
খালি ডেটাফ্রেম (বা এনএএনগুলির মধ্যে একটি) তৈরি করা এবং বার বার এটি যুক্ত করার চেয়ে তালিকায় যুক্ত হওয়া এবং একযোগে ডেটা ফ্রেম তৈরি করা সর্বদা সস্তা is তালিকাগুলিও কম স্মৃতি গ্রহণ করে এবং এটি কাজ করার জন্য অনেক হালকা ডেটা স্ট্রাকচার , সংযোজন করতে এবং মুছে ফেলার জন্য (যদি প্রয়োজন হয়) ।
এই পদ্ধতির অন্যান্য সুবিধা হ'ল dtypes
স্বয়ংক্রিয়ভাবে অনুমান করা হয় ( object
তাদের সকলের জন্য বরাদ্দ না করে)।
শেষ সুবিধাটি হ'ল একটি RangeIndex
হ'ল স্বয়ংক্রিয়ভাবে আপনার ডেটার জন্য তৈরি হয় , তাই এটি নিয়ে চিন্তিত হওয়া কম জিনিস (দরিদ্রদের দিকে একবার নজর দিন append
এবংloc
নীচের পদ্ধতিগুলি দেখুন, আপনি উভয় উপাদানই দেখতে পাবেন যার জন্য সূচককে যথাযথভাবে পরিচালনা করা প্রয়োজন)।
আপনার যা করা উচিত নয়
append
অথবা concat
একটি লুপ ভিতরে
আমি এখানে প্রথম দিক থেকে সবচেয়ে বড় ভুলটি দেখেছি:
df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
df = df.append({'A': i, 'B': b, 'C': c}, ignore_index=True) # yuck
# or similarly,
# df = pd.concat([df, pd.Series({'A': i, 'B': b, 'C': c})], ignore_index=True)
আপনার প্রতিটি append
বা concat
অপারেশনের জন্য মেমরি পুনরায় বরাদ্দ করা হয়। একটি লুপ সঙ্গে দম্পতি এই এবং আপনি একটি আছে দ্বিঘাত জটিলতা অপারেশন । থেকে df.append
ডক পৃষ্ঠা :
স্বতঃস্ফূর্তভাবে একটি ডেটা ফ্রেমে সারি যুক্ত করা একটি একক কনটেনেটের চেয়ে আরও বেশি গণনামূলক নিবিড় হতে পারে। একটি ভাল সমাধান হ'ল এই সারিগুলিকে একটি তালিকায় যুক্ত করা এবং তারপরে তালিকাটি একবারে মূল ডেটা ফ্রেমের সাথে সংযুক্ত করা।
এর সাথে যুক্ত অন্য ভুলটি df.append
হ'ল ব্যবহারকারীরা অ্যাপেনড ভুলে যাওয়ার প্রবণতা কোনও স্থানের কোনও কাজ নয় , সুতরাং ফলাফলটি অবশ্যই বরাদ্দ করতে হবে। টাইপগুলি সম্পর্কে আপনাকেও চিন্তা করতে হবে:
df = pd.DataFrame(columns=['A', 'B', 'C'])
df = df.append({'A': 1, 'B': 12.3, 'C': 'xyz'}, ignore_index=True)
df.dtypes
A object # yuck!
B float64
C object
dtype: object
অবজেক্ট কলামগুলির সাথে ডিল করা কখনই ভাল জিনিস নয়, কারণ পান্ডারা those কলামগুলিতে অপারেশনকে ভেক্টরাইজ করতে পারে না। এটি ঠিক করার জন্য আপনাকে এটি করতে হবে:
df.infer_objects().dtypes
A int64
B float64
C object
dtype: object
loc
একটি লুপ ভিতরে
আমি loc
খালি তৈরি করা ডেটাফ্রেমে সংযোজন করতেও ব্যবহার করতে দেখেছি :
df = pd.DataFrame(columns=['A', 'B', 'C'])
for a, b, c in some_function_that_yields_data():
df.loc[len(df)] = [a, b, c]
আগের মত, আপনি প্রতিবার যে পরিমাণ মেমরি প্রয়োজন তা আপনি প্রাক-বরাদ্দ করেননি, তাই প্রতিবার নতুন সারি তৈরি করার সময় মেমরিটি আবার বাড়ানো হয় । এটা ঠিক হিসাবে খারাপappend
, তেমনি আরও ।
এনএএনদের খালি ডেটাফ্রেম
এবং তারপরে, সেখানে NaNs এর একটি ডেটাফ্রেম তৈরি করা হচ্ছে এবং এর সাথে যুক্ত সমস্ত ক্যাভ্যাট রয়েছে।
df = pd.DataFrame(columns=['A', 'B', 'C'], index=range(5))
df
A B C
0 NaN NaN NaN
1 NaN NaN NaN
2 NaN NaN NaN
3 NaN NaN NaN
4 NaN NaN NaN
এটি অন্যের মতো অবজেক্ট কলামগুলির একটি ডেটাফ্রেম তৈরি করে।
df.dtypes
A object # you DON'T want this
B object
C object
dtype: object
উপরোক্ত পদ্ধতি হিসাবে এখনও যোগ করার সমস্ত সমস্যা রয়েছে all
for i, (a, b, c) in enumerate(some_function_that_yields_data()):
df.iloc[i] = [a, b, c]
প্রুফ পুডিংয়ে আছে
এই পদ্ধতিগুলির সময় নির্ধারণ করা তাদের স্মৃতি এবং ইউটিলিটির দিক থেকে কতটা পৃথক see তা দেখার দ্রুততম উপায়।
রেফারেন্সের জন্য বেঞ্চমার্কিং কোড।