প্রাথমিক উদ্দেশ্য হল শৃঙ্খলিত সূচী এড়ানো এবং এটিকে নির্মূল করা SettingWithCopyWarning
।
এখানে শৃঙ্খলিত সূচকগুলি হ'ল কিছু dfc['A'][0] = 111
নথিতে বলা হয়েছে একটি অনুলিপি বনাম কোনও অনুলিপি ফিরিয়ে দেওয়ার ক্ষেত্রে শৃঙ্খলিত সূচকগুলি এড়ানো উচিত । এখানে এই দস্তাবেজ থেকে কিছুটা পরিবর্তিত উদাহরণ দেওয়া হয়েছে:
In [1]: import pandas as pd
In [2]: dfc = pd.DataFrame({'A':['aaa','bbb','ccc'],'B':[1,2,3]})
In [3]: dfc
Out[3]:
A B
0 aaa 1
1 bbb 2
2 ccc 3
In [4]: aColumn = dfc['A']
In [5]: aColumn[0] = 111
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [6]: dfc
Out[6]:
A B
0 111 1
1 bbb 2
2 ccc 3
এখানে aColumn
একটি দৃশ্য এবং মূল DataFrame থেকে একটি কপি, তাই পরিবর্তন হয় aColumn
কারণ হবে মূল dfc
খুব পরিবর্তন করা। পরবর্তী, আমরা যদি প্রথমে সারিটি সূচক করি:
In [7]: zero_row = dfc.loc[0]
In [8]: zero_row['A'] = 222
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [9]: dfc
Out[9]:
A B
0 111 1
1 bbb 2
2 ccc 3
এই সময়টি zero_row
একটি অনুলিপি, সুতরাং আসলটি dfc
পরিবর্তন করা হয়নি।
উপরের এই দুটি উদাহরণ থেকে আমরা দেখতে পাচ্ছি যে আপনি মূল ডেটাফ্রেম পরিবর্তন করতে চান কিনা তা অস্পষ্ট। আপনি নিম্নলিখিত হিসাবে কিছু লিখলে এটি বিশেষত বিপজ্জনক:
In [10]: dfc.loc[0]['A'] = 333
SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
In [11]: dfc
Out[11]:
A B
0 111 1
1 bbb 2
2 ccc 3
এবার মোটেই কাজ হয়নি। এখানে আমরা পরিবর্তন করতে চেয়েছিলাম dfc
, কিন্তু আমরা আসলে একটি অন্তর্বর্তী মানটি সংশোধন করেছিলাম dfc.loc[0]
যা একটি অনুলিপি এবং অবিলম্বে বাতিল করা হবে। এটা তোলে ভবিষ্যদ্বাণী করা হবে কিনা তা মত অন্তর্বর্তী মান খুব কঠিন dfc.loc[0]
বা dfc['A']
, একটি দর্শন বা একটি অনুলিপি তাই এটা নিশ্চিত না হোক বা না হোক মূল DataFrame আপডেট করা হবে। এই কারণেই শৃঙ্খলিত সূচকগুলি এড়ানো উচিত এবং SettingWithCopyWarning
এই জাতীয় শৃঙ্খলাবদ্ধতার আপডেটের জন্য পান্ডাস উত্পন্ন করে ।
এখন এর ব্যবহার .copy()
। সতর্কতাটি দূর করতে, আপনার উদ্দেশ্যটি স্পষ্টভাবে প্রকাশ করার জন্য একটি অনুলিপি করুন:
In [12]: zero_row_copy = dfc.loc[0].copy()
In [13]: zero_row_copy['A'] = 444 # This time no warning
যেহেতু আপনি একটি অনুলিপি পরিবর্তন করছেন, আপনি জানেন যে আসলটি dfc
কখনই পরিবর্তিত হবে না এবং আপনি এটি পরিবর্তন করারও আশা করছেন না। আপনার প্রত্যাশা আচরণের সাথে মেলে, তবে SettingWithCopyWarning
অদৃশ্য হয়ে যায়।
দ্রষ্টব্য, আপনি যদি মূল ডেটা ফ্রেমটি সংশোধন করতে চান তবে দস্তাবেজটি আপনাকে ব্যবহার করার পরামর্শ দেয় loc
:
In [14]: dfc.loc[0,'A'] = 555
In [15]: dfc
Out[15]:
A B
0 555 1
1 bbb 2
2 ccc 3