বনাম অনুলিপি তৈরির জন্য পান্ডারা কোন নিয়ম ব্যবহার করেন?


118

ডেটাফ্রেম থেকে নির্বাচন মূল ডাটাফ্রেমের একটি অনুলিপি বা মূলের উপর দৃষ্টিভঙ্গি করার সময় পান্ডারা যে নিয়মগুলি ব্যবহার করে সে সম্পর্কে আমি বিভ্রান্ত।

যদি আমার কাছে থাকে, উদাহরণস্বরূপ,

df = pd.DataFrame(np.random.randn(8,8), columns=list('ABCDEFGH'), index=range(1,9))

আমি বুঝতে পারি যে কোনও queryপ্রতিলিপি ফেরত দেয় যাতে কিছু পছন্দ হয়

foo = df.query('2 < index <= 5')
foo.loc[:,'E'] = 40

মূল ডেটাফ্রেমে কোনও প্রভাব ফেলবে না df,। আমি আরও বুঝতে পারি যে স্কেলার বা নামযুক্ত টুকরোগুলি একটি দর্শন ফিরিয়ে দেয়, যাতে এইগুলিতে এই নিয়োগগুলি

df.iloc[3] = 70

অথবা

df.ix[1,'B':'E'] = 222

পরিবর্তন হবে df। তবে জটিল সমস্যাগুলির ক্ষেত্রে আমি হারিয়েছি। উদাহরণ স্বরূপ,

df[df.C <= df.B] = 7654321

পরিবর্তন df, কিন্তু

df[df.C <= df.B].ix[:,'B':'E']

না.

পান্ডগণ যে স্রেফ নিখোঁজ রয়েছেন সেটির কোনও সাধারণ নিয়ম আছে? এই নির্দিষ্ট ক্ষেত্রে কী চলছে; এবং বিশেষত, আমি কীভাবে একটি ডেটাফ্রেমে সমস্ত মান (বা মানগুলির একটি উপসেট) পরিবর্তন করব যা একটি নির্দিষ্ট ক্যোয়ারীকে সন্তুষ্ট করে (যেমন আমি উপরের শেষ উদাহরণে চেষ্টা করার চেষ্টা করছি)?


দ্রষ্টব্য: এটি এই প্রশ্নের মতো নয় ; এবং আমি ডকুমেন্টেশন পড়েছি , কিন্তু এটি দ্বারা আলোকিত হয় না। আমি এই বিষয়ে "সম্পর্কিত" প্রশ্নগুলিও পড়েছি, তবে পাণ্ডরা যে সাধারণ নিয়মটি ব্যবহার করছেন সেটি আমি এখনও অনুপস্থিত এবং কীভাবে আমি এটি প্রয়োগ করব - উদাহরণস্বরূপ - মানগুলি সংশোধন করুন (বা মানগুলির একটি উপসেট) একটি ডেটাফ্রেমে যা কোনও নির্দিষ্ট ক্যোয়ারিকে সন্তুষ্ট করে।

উত্তর:


138

এখানে বিধিগুলি, পরবর্তী ওভাররাইড:

  • সমস্ত ক্রিয়াকলাপ একটি অনুলিপি তৈরি করে

  • যদি সরবরাহ করা inplace=Trueহয় তবে এটি স্থানান্তরিত হবে; শুধুমাত্র কিছু অপারেশন এটি সমর্থন করে

  • একটি সূচক যা সেট করে, যেমন স্থান .loc/.iloc/.iat/.atস্থাপন করবে।

  • একটি সূচক যা একক dtyped অবজেক্টে পায় প্রায় সর্বদা একটি দর্শন হয় (মেমরির লেআউটের উপর নির্ভর করে এটি এটি নির্ভরযোগ্য নয় কারণ)। এটি মূলত দক্ষতার জন্য। (উপরের উদাহরণটি এর জন্য .query; এটি সর্বদা অনুলিপি হিসাবে একটি অনুলিপি ফিরে আসবে numexpr)

  • একটি সূচক যা একাধিক-টাইপযুক্ত বস্তুটিতে আসে সর্বদা একটি অনুলিপি।

আপনার উদাহরণ chained indexing

df[df.C <= df.B].loc[:,'B':'E']

কাজের গ্যারান্টিযুক্ত নয় (এবং এভাবে আপনি কখনই চিৎকার করবেন না করবেন )।

পরিবর্তে করুন:

df.loc[df.C <= df.B, 'B':'E']

এটি দ্রুত হিসাবে এবং সর্বদা কাজ করবে work

শৃঙ্খলিত সূচকটি 2 পৃথক পাইথন অপারেশন এবং সুতরাং পান্ডা দ্বারা নির্ভরযোগ্যভাবে বাধা দেওয়া যায় না (আপনি প্রায়শই একটি পাবেন SettingWithCopyWarningতবে এটি 100% সনাক্তকারীও নয়)। আপনি যে ডিভ ডক্সটি দেখিয়েছেন সেগুলি আরও অনেক সম্পূর্ণ ব্যাখ্যা সরবরাহ করে।


3
.queryএটি কীভাবে করায় (এবং একটি ভিউ নয়) এর জন্য একটি অনুলিপি সর্বদা ফিরিয়ে দেবে, কারণ এটি n numexpr দ্বারা মূল্যায়ন করা হয়েছে। সুতরাং আমি এটিকে 'বিধিগুলিতে' যোগ করব
জেফ

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

3
অনেক ধন্যবাদ জেফ, আপনার উত্তরটি সবচেয়ে কার্যকর। এই বিষয়টিতে আপনার উত্স / রেফারেন্স কী?
কামিক্সাভে

4
তারপরে প্রথমে আপনার দুর্দান্ত কাজের জন্য ধন্যবাদ! এবং দ্বিতীয়ত, আপনার যদি পর্যাপ্ত সময় থাকে তবে আমার মনে হয় ডকটিতে আপনার মূল উত্তরের অনুরূপ একটি অনুচ্ছেদ যুক্ত করা ভাল।
কামিক্সাভে

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