অন্তঃস্থল বোঝা = সত্য


104

ইন pandasগ্রন্থাগার অনেকবার নিম্নোক্ত বিবৃতি সঙ্গে যেমন inplace বস্তুর পরিবর্তন করার জন্য একটি বিকল্প আছে ...

df.dropna(axis='index', how='all', inplace=True)

আমি কী উত্সাহিত তা কীভাবে ফিরে আসবে পাশাপাশি কীভাবে যখন inplace=Trueবনাম পাস করা হয় তখন কীভাবে বস্তুটি পরিচালনা করা হয় inplace=False

সমস্ত অপারেশন selfকখন সংশোধন করা হয় inplace=True? এবং inplace=Falseতত্ক্ষণাত্ যখন নতুন কোনও বস্তু তৈরি হয় new_df = selfএবং তারপরে new_dfফিরে আসে?


13
হ্যাঁ, inplace=Trueরিটার্নগুলি None inplace=Falseঅপারেশন সম্পাদন করে অবজেক্টের একটি অনুলিপি দেয়। ডক্সগুলি এ সম্পর্কে খুব স্পষ্ট, এমন কোনও কিছু রয়েছে যা একটি নির্দিষ্ট অংশের সাথে বিভ্রান্ত করছে? স্পষ্টতঃIf True, do operation inplace and return None.
এডচুম

আমি ডেটাফ্রেম অবজেক্টটি সাবক্লাসিং করছি এবং মার্জ করার মতো একটি অপারেশনের মাধ্যমে এটি অন্তর্নিহিত করা সম্ভব বলে মনে হচ্ছে না ... self = self.merge(new_df, how='left', on='column2' আমি নিশ্চিত নই যে এটি নিজেকে পুনরায়
অর্পণ করা

4
আপনি সঠিক যে ডেটাফ্রেম.মিটারের কোনও inplaceযুক্তি নেই। এটি একটি ডেটা ফ্রেম প্রদান করে, তাই পুনরায় নিয়োগের কোনও সমস্যা নেই।
জেভি

এটির ব্যবহারের ক্ষেত্রে কেউ কি এটি ব্যবহারের সুবিধাগুলি হাইলাইট করতে পারে?
মার্কক্রক্সর

4
@markroxor সত্যিই খুব বেশি কিছু নেই। উদাহরণস্বরূপ, inplaceক্রিয়াটি আরও দ্রুত হতে পারে যেহেতু আপনাকে আসলে ফলাফলের একটি অনুলিপি ফেরত দিতে হবে না। কিন্তু এটি সম্পর্কে। এটি ব্যবহার না করার আরও অনেক কারণ রয়েছে।
cs95

উত্তর:


96

inplace=Trueপাস হয়ে গেলে , ডেটা স্থানটিতে নতুন নামকরণ করা হয় (এটি কিছুই দেয় না), সুতরাং আপনি ব্যবহার করতে চান:

df.an_operation(inplace=True)

inplace=Falseপাস হয়ে গেলে (এটি ডিফল্ট মান, সুতরাং প্রয়োজনীয় নয়), ক্রিয়াকলাপটি সম্পাদন করে এবং অবজেক্টের একটি অনুলিপি প্রদান করে, যাতে আপনি ব্যবহার করতে চান:

df = df.an_operation(inplace=False) 

আমি কি এই ভেবে সঠিক হতে পারি যে inplaceকেবল বিদ্যমান পদ্ধতির পরিবর্তিত পদ্ধতির জন্য একটি বিকল্প, তবে সেই পদ্ধতিগুলির জন্য নয় যা ডেটা 'পুনরায় আকার দেবে'। উদাহরণস্বরূপ, বিদ্যমান। সূচকগুলিতে মানগুলি প্রয়োগ করে হিসাবে আমি .set_index (অন্তর্ভুক্ত = সত্য) করতে পারি, তবে .reindex করতে পারি না (অন্তর্ভুক্ত = সত্য) কারণ এটি পূর্ববর্তী অ্যারেতে উপস্থিত না থাকা ডেটা ফ্রেমের অতিরিক্ত সারি তৈরি করতে পারে this ?
ac24

4
পদ্ধতিটি .dropna()গ্রহণ করে inplace=Trueএবং সুনির্দিষ্টভাবে ডেটা ফ্রেমটি পুনরায় আকার দিতে পারে, তাই না।
jorijnsmit

4
আপনার এখানে সাবধানতা অবলম্বন করতে হবে। @ ac24 আসলে কম বেশি সঠিক। dropnaবিভিন্ন আকারের একটি ডেটাফ্রেম ফেরত দেওয়ার সময় এটি অন্তর্নিহিত ডেটাগুলি পুনরায় আকার দেয় না - এটি কেবল (কখন inplace=False) তার উপর একটি মুখোশ ফেরত দেয় যা ভয়ঙ্কর দিকে পরিচালিত করতে পারে SettingWithCopyWarning। পুরানো মানগুলির আর কোনও রেফারেন্স নেই কেবল তখনই মুখোশ অনুযায়ী পান্ডাস পুনরায় আকার দেবে। থাম্বের আরও ভাল নিয়মটি হ'ল: inplaceযখন অপারেশনটিতে মানগুলির একটি নতুন ব্যাকিং ন্যাটারে বরাদ্দ না হয় তখন উপলব্ধ।
বলপয়েন্টবেন

46

আমি যেভাবে এটি ব্যবহার করি তা হ'ল

# Have to assign back to dataframe (because it is a new copy)
df = df.some_operation(inplace=False) 

বা

# No need to assign back to dataframe (because it is on the same copy)
df.some_operation(inplace=True)

উপসংহার:

 if inplace is False
      Assign to a new variable;
 else
      No need to assign

4
হাই @Nabin, এখানেই পথ পান্ডাস এবং Numpy উপর :-) কাজ যে কেউ জন্য খুব স্পষ্ট
Vetrivel দ্রষ্টব্য

44

পান্ডাসে, ইনপ্লেস = সত্যকে ক্ষতিকারক বলে মনে করা হয়, না?

টিএলডিআর; হ্যাঁ হ্যাঁ এটাই.

  • inplace, নামটি যা বোঝায় তার বিপরীতে, প্রায়শই অনুলিপিগুলি তৈরি হতে বাধা দেয় না এবং (প্রায়) কখনই কোনও কার্যকারিতা সুবিধা দেয় না
  • inplace পদ্ধতি শৃঙ্খল সঙ্গে কাজ করে না
  • inplace নতুনদের জন্য একটি সাধারণ ক্ষতি, তাই এই বিকল্পটি সরানো এপিআইকে সহজতর করবে

আমি এই পরামিতিটি সেট করার পরামর্শ দিচ্ছি না কারণ এটি খুব কম উদ্দেশ্য করে । দেখুন এই GitHub ইস্যু যা প্রস্তাব inplaceযুক্তি API ব্যাপী উঠিয়ে নেওয়া।

এটি একটি সাধারণ ভ্রান্ত ধারণা যে ব্যবহারটি inplace=Trueআরও দক্ষ বা অনুকূলিত কোডের দিকে পরিচালিত করবে। বাস্তবে, ব্যবহার করার জন্য কোনও কার্যকারিতা সুবিধা নেইinplace=True । স্থান এবং স্থানের বাইরে উভয় সংস্করণই যাইহোক তথ্যের অনুলিপি তৈরি করে , স্থানের সংস্করণটি স্বয়ংক্রিয়ভাবে অনুলিপিটি ফিরিয়ে দেয়।

inplace=Trueনতুনদের জন্য এটি একটি সাধারণ সমস্যা। উদাহরণস্বরূপ, এটি ট্রিগার করতে পারেSettingWithCopyWarning :

df = pd.DataFrame({'a': [3, 2, 1], 'b': ['x', 'y', 'z']})

df2 = df[df['a'] > 1]
df2['b'].replace({'x': 'abc'}, inplace=True)
# SettingWithCopyWarning: 
# A value is trying to be set on a copy of a slice from a DataFrame

ডেটাফ্রেম কলামে কোনও ফাংশন কল করা inplace=True বা নাও কাজ করতে পারে । এটি বিশেষত সত্য যখন শৃঙ্খলিত সূচক জড়িত থাকে।

যেন সমস্যার উপরে বর্ণিত যথেষ্ট নয়, inplace=Trueএছাড়াও পদ্ধতি chaining পথে অন্তরায় । কাজের বিপরীতে

result = df.some_function1().reset_index().some_function2()

উল্টোদিকে

temp = df.some_function1()
temp.reset_index(inplace=True)
result = temp.some_function2()

প্রাক্তন নিজেকে উন্নত কোড সংগঠন এবং পাঠযোগ্যতার জন্য ndsণ দেয়।


অন্য সমর্থনকারী দাবিটি হ'ল এর জন্য set_axisসম্প্রতি এপিআই পরিবর্তন করা হয়েছিল যে inplaceডিফল্ট মানটিকে সত্য থেকে মিথ্যাতে পরিবর্তন করা হয়েছিল। GH27600 দেখুন । দুর্দান্ত কাজ!


inplace=Trueশেইন ইত্যাদির সাথে অবশ্যই কাজ করে না তবে এটি স্পষ্টত আপনি বুঝতে পারছেন যে এটি ধারণামূলকভাবে কী করছে। ব্যক্তিগতভাবে অ্যাসাইনমেন্ট এড়ানোর জন্য এটি আমাকে একটু ক্লিনার মনে হচ্ছে- আপনি কি list.sortস্ট্যান্ডার্ড লাইব্রেরি থেকে ইত্যাদি সরানোর পক্ষে হয়ে থাকবেন ?
Chris_Rands

4
আমি মনে করি না যে এটি একটি উপযুক্ত তুলনা। তালিকা ব্যবহারের কিছু সুস্পষ্ট সুবিধা রয়েছে: বাছাই করা বনাম সাজান। একই জায়গায় অন্য কারও সাথে কাজ করে। এখানে কোনও আসল উপকার নেই, পানডে পদ্ধতিতে শৃঙ্খলাবদ্ধতা অনেক বেশি সাধারণ এবং যেভাবেই হোক এই যুক্তির অবমূল্যায়নের পরিকল্পনা রয়েছে।
cs95

অ্যাসাইনমেন্ট এড়ানোর জন্য আমি এটি আরও পরিষ্কার পরিচ্ছন্ন দেখতে পেয়েছি: উদাহরণস্বরূপ, list.append()পাইথনগুলিও জায়গাটিতে রয়েছে, যখন পান্ডাস ডিএফ.পেন্ড নেই (এবং এটি অন্তর্নিহিতকে সমর্থন করে না), যা আমাকে শেষ পর্যন্ত বিরক্ত করে। কোন কারণেই আমি জানতে চাই, আসল উপকারিতা কী তা বোঝার জন্য - list.sort বনাম বাছাই করা, অ্যাসাইনমেন্ট এড়ানো বাদ দিয়ে সুস্পষ্ট সুবিধা কী? অন্যথায়, আমি মনে করি এখানে আসল উপকার আছে - আমি দায়িত্ব এড়াতে সক্ষম হচ্ছি, যেখানে আমি ব্যক্তিগতভাবে এটি আরও পাঠযোগ্য find
sdbbs

4
@sdbbs list.append()একটি বিদ্যমান তালিকায় যুক্ত হয়েছে। df.appendআপনার ডেটার একটি অনুলিপি তৈরি করে (আপনার কাছে 5 টি সারি বা 5 মিলিয়ন রয়েছে তা বিবেচনা করে না), তারপরে আপনার অনুলিপিটিতে একটি নতুন সারি যুক্ত করুন, তারপরে এটি ফিরিয়ে দিন। আপনি কি আরও বোধগম্য মনে করেন? Df.append হিসাবে, পজিবল হিসাবে অনেক এড়ান । আমি মনে করি না যে এটি ইনপ্লেস = যুক্তিযুক্ত পক্ষে যুক্তি দেওয়া ভাল উদাহরণ, আমি এমনকি এপিআইতে এই ফাংশনটির একটি জায়গা আছে বলেও মনে করি না।
cs95

6

inplaceপরামিতি:

df.dropna(axis='index', how='all', inplace=True)

মধ্যে Pandasএবং সাধারণ অর্থ হলো:

1. পান্ডস মূল তথ্যটির একটি অনুলিপি তৈরি করে

২. ... এটিতে কিছু গণনা করে

3. ... ফলাফলগুলি মূল ডেটাতে বরাদ্দ করে।

৪. ... অনুলিপি মুছে দেয়।

আপনি আমার উত্তর বাকি পড়তে পারেন যা নিচে, আমরা এখনও করতে পারেন অর্থাত এই প্যারামিটারটি ব্যবহার করা উত্তম কারণ রয়েছে inplace operations, কিন্তু আমরা, আমরা যদি তা এড়িয়ে চলা উচিত হিসাবে এটি আরো সমস্যা জেনারেট করেন, যেমন:

1. আপনার কোডটি ডিবাগ করা আরও শক্ত হবে (প্রকৃতপক্ষে সেটিংউথকপি ওয়ার্নিং আপনাকে এই সম্ভাব্য সমস্যার প্রতি সতর্ক করার জন্য দাঁড়িয়েছে)

2. পদ্ধতি শৃঙ্খল সঙ্গে বিরোধ


আমাদের এমনকি এটি ব্যবহার করা উচিত যখন এমনকি কেস আছে?

অবশ্যই হ্যাঁ. যদি আমরা বিশাল ডেটাসেট হ্যান্ডেল করার জন্য পান্ডাস বা কোনও সরঞ্জাম ব্যবহার করি তবে আমরা সহজেই পরিস্থিতির মুখোমুখি হতে পারি, যেখানে কিছু বড় ডেটা আমাদের পুরো স্মৃতি গ্রাস করতে পারে। এই অযাচিত প্রভাব এড়াতে আমরা কিছু প্রযুক্তি যেমন পদ্ধতি শৃঙ্খলা ব্যবহার করতে পারি :

(
    wine.rename(columns={"color_intensity": "ci"})
    .assign(color_filter=lambda x: np.where((x.hue > 1) & (x.ci > 7), 1, 0))
    .query("alcohol > 14 and color_filter == 1")
    .sort_values("alcohol", ascending=False)
    .reset_index(drop=True)
    .loc[:, ["alcohol", "ci", "hue"]]
)

যা আমাদের কোডটিকে আরও কমপ্যাক্ট করে তোলে (তবুও ব্যাখ্যা করা ও ডিবাগ করা আরও শক্ত) এবং শৃঙ্খলিত পদ্ধতিগুলি অন্য পদ্ধতির প্রত্যাবর্তিত মানগুলির সাথে কাজ করে বলে কম মেমরি গ্রহণ করে, ফলে ইনপুট ডেটার কেবল একটি অনুলিপি তৈরি হয়। আমরা পরিষ্কারভাবে দেখতে পাচ্ছি, আমাদের এই ক্রিয়াকলাপের পরে 2 x অরিজিনাল ডেটা মেমরির খরচ হবে।

অথবা আমরা inplaceপ্যারামিটারটি ব্যবহার করতে পারি (যদিও এটি ব্যাখ্যা করতে এবং ডিবাগ করা আরও শক্ত) তবে আমাদের মেমরির খরচ 2 x মূল ডেটা হবে তবে এই অপারেশনের পরে আমাদের মেমরির খরচ 1 x মূল ডেটা থেকে যায় , যা যদি কেউ যখনই বিশাল ডেটাসেটের সাথে কাজ করে ঠিক তখন জানতে পারে তবে এটি হতে পারে বড় সুবিধা


চূড়ান্ত উপসংহার:

inplaceপ্যারামিটার ব্যবহার এড়িয়ে চলুন যতক্ষণ না আপনি বিশাল ডেটা নিয়ে কাজ না করেন এবং এটি ব্যবহারের ক্ষেত্রে এর সম্ভাব্য সমস্যা সম্পর্কে অবহিত না হন।


2

এটি একই ভেরিয়েবলে সংরক্ষণ করুন

data["column01"].where(data["column01"]< 5, inplace=True)

এটি একটি পৃথক ভেরিয়েবলে সংরক্ষণ করুন

data["column02"] = data["column01"].where(data["column1"]< 5)

তবে, আপনি সর্বদা চলকটি ওভাররাইট করতে পারেন

data["column01"] = data["column01"].where(data["column1"]< 5)

এফওয়াইআই: ডিফল্ট inplace = False


1

কোনও ফাংশন ব্যবহার করে কোনও পান্ডাস ডেটাফ্রেমে পরিবর্তন করার চেষ্টা করার সময়, আমরা যদি ডেটা ফ্রেমে পরিবর্তনগুলি করতে চাই তবে আমরা 'ইনপ্লেস = ট্রু' ব্যবহার করি। সুতরাং, নিম্নলিখিত কোডের প্রথম লাইনটি 'df' এর প্রথম কলামের নামকে 'গ্রেডস' এ পরিবর্তন করে। আমরা ফলাফল ডাটাবেস দেখতে চাইলে আমাদের ডাটাবেস কল করতে হবে।

df.rename(columns={0: 'Grades'}, inplace=True)
df

আমরা যখন পরিবর্তনগুলি প্রতিপন্ন করতে চাই না তবে কেবল ফলাফল ডাটাবেসটি মুদ্রণ করি তখন আমরা 'ইনপ্লেস = ফলস' (এটি ডিফল্ট মানও) ব্যবহার করি। সুতরাং, কার্যকরভাবে প্রতিশ্রুতিবদ্ধ পরিবর্তনগুলির সাথে মূল ডাটাবেসের একটি অনুলিপি মূল ডাটাবেস পরিবর্তন না করে মুদ্রিত হয়।

কেবল আরও পরিষ্কার করার জন্য, নিম্নলিখিত কোডগুলি একই কাজ করে:

#Code 1
df.rename(columns={0: 'Grades'}, inplace=True)
#Code 2
df=df.rename(columns={0: 'Grades'}, inplace=False}

0

inplace=True আপনি যদি মূল ডিএফ পরিবর্তন করতে চান বা না চান তা নির্ভর করে ব্যবহার করা হয়।

df.drop_duplicates()

শুধুমাত্র বাদ দেওয়া মানগুলির একটি দৃষ্টিভঙ্গি তৈরি করবে তবে ডিএফ-তে কোনও পরিবর্তন করবে না

df.drop_duplicates(inplace  = True)

মান ড্রপ এবং df পরিবর্তন করতে হবে।

আশাকরি এটা সাহায্য করবে.:)


0

inplace=Trueফাংশন অশুচি করে তোলে। এটি মূল ডেটাফ্রেমে পরিবর্তন করে এবং কোনও কিছুই প্রদান করে না। সেক্ষেত্রে আপনি ডিএসএল চেইনটি ভাঙ্গেন। যেহেতু বেশিরভাগ ডেটাফ্রেম ফাংশন একটি নতুন ডেটাফ্রেম দেয়, আপনি ডিএসএলটি সুবিধামত ব্যবহার করতে পারেন। পছন্দ

df.sort_values().rename().to_csv()

inplace=Trueরিটার্ন সহ ফাংশন কল এবং ডিএসএল চেইনটি নষ্ট হয়ে গেছে is উদাহরণ স্বরূপ

df.sort_values(inplace=True).rename().to_csv()

নিক্ষেপ করবে NoneType object has no attribute 'rename'

পাইথনের বিল্ড-ইন বাছাই এবং বাছাইয়ের সাথে অনুরূপ কিছু। lst.sort()রিটার্ন করে Noneএবং sorted(lst)একটি নতুন তালিকা দেয়।

সাধারণত, এটি inplace=Trueকরার নির্দিষ্ট কারণ না থাকলে ব্যবহার করবেন না । আপনার যখন পুনরায় নিয়োগ কোডটি লিখতে হবে df = df.sort_values()তখন ডিএসএল চেইনে ফাংশন কলটি সংযুক্ত করার চেষ্টা করুন, যেমন eg

df = pd.read_csv().sort_values()...

যথাযথ ফরমেটিংয়ের সাথে সঠিক ওয়ার্কিং কোড সরবরাহ করা ব্যবহারকারীদের আপনার উত্তরটি দ্রুত বুঝতে সাহায্য করবে। আপনাকেও অনুরোধ করছি। আমি কোনও পান্ডার বিশেষজ্ঞ নই, সুতরাং আপনাকে উত্তরটি পুনরায় ফর্ম্যাট করতে পারবেন না, তবে এটির উচ্চ প্রস্তাবিত,
আনন্দ বৈদ্য

0

পান্ডসে আমার অভিজ্ঞতার উত্তর আমি দিতে চাই।

'ইনপ্লেস = ট্রু' যুক্তিটি ডেটা ফ্রেমের জন্য দাঁড়ায় যেমন স্থায়ী উদাহরণস্বরূপ পরিবর্তন করতে হয়।

    df.dropna(axis='index', how='all', inplace=True)

একই ডেটাফ্রেম পরিবর্তন করে (যেমন এই পান্ডারা সূচীতে NAN এন্ট্রিগুলি খুঁজে পায় এবং সেগুলি ড্রপ করে)। যদি আমরা চেষ্টা করি

    df.dropna(axis='index', how='all')

পান্ডস আমরা যে পরিবর্তনগুলি করেছি তা দিয়ে ডেটাফ্রেম দেখায় তবে মূল ডেটা ফ্রেম 'ডিএফ' সংশোধন করবে না।


0

আপনি যদি ইনপ্লেস = সত্য ব্যবহার করেন না বা আপনি ইনপ্লেস = মিথ্যা ব্যবহার করেন তবে আপনি মূলত একটি অনুলিপি ফিরে পাবেন।

উদাহরণস্বরূপ:

testdf.sort_values(inplace=True, by='volume', ascending=False)

অবতরণ ক্রমে সাজানো ডেটা দিয়ে কাঠামো পরিবর্তন করবে।

তারপরে:

testdf2 = testdf.sort_values( by='volume', ascending=True)

testdf2 কে একটি অনুলিপি তৈরি করবে। মানগুলি সব একই হবে তবে সাজানোটি বিপরীত হবে এবং আপনার একটি স্বাধীন অবজেক্ট থাকবে।

তারপরে আর একটি কলাম দেওয়া হয়েছে, লংগএমএ বলুন এবং আপনি যা করেন:

testdf2.LongMA = testdf2.LongMA -1

টেস্টডিএফ-এর লংএমএএম কলামের মূল মান থাকবে এবং টেস্টডিএফ 2 এর ডিক্রিমেটেড মান থাকবে।

গণনার শৃঙ্খলা বাড়ার সাথে সাথে ডেটাফ্রেমগুলির অনুলিপিগুলির নিজস্ব জীবনকাল রয়েছে বলে পার্থক্যটি লক্ষ্য রাখা গুরুত্বপূর্ণ।


0

হ্যাঁ, পান্ডাসে আমাদের অনেক ফাংশনের প্যারামিটার রয়েছে inplaceতবে ডিফল্টরূপে এটি নির্ধারিত হয় False

সুতরাং, যখন আপনি df.dropna(axis='index', how='all', inplace=False)এটি করেন মনে করেন যে আপনি অরিয়েন্টিয়ালটি পরিবর্তন করতে চান না DataFrame, সুতরাং এটি পরিবর্তিতভাবে প্রয়োজনীয় পরিবর্তনগুলি সহ আপনার জন্য একটি নতুন অনুলিপি তৈরি করে

তবে, আপনি যখন inplaceপ্যারামিটারটি পরিবর্তন করেনTrue

তারপরে এটি স্পষ্টতই বলার সমতুল্য যে DataFrameপরিবর্তিত প্রদত্ত পরিবর্তনের জন্য আমি একটি নতুন অনুলিপি চাই নাDataFrame

এটি পাইথন দোভাষীকে নতুন তৈরি না করতে বাধ্য করেDataFrame

তবে আপনি inplaceফলাফলটি অরিজেনাল ডেটাফ্রেমে পুনরায় অর্পণ করে প্যারামিটার ব্যবহারটি এড়াতে পারবেন

df = df.dropna(axis='index', how='all')

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.