[:] বনাম আইলোক [:] এর সাথে নিয়োগের কারণে পান্ডে বিভিন্ন ফল পাওয়া যায়?


13

আমি ilocপান্ডায় ব্যবহার করে বিভিন্ন সূচক পদ্ধতিতে এত বিভ্রান্ত হয়ে পড়েছি ।

যাক আমি 1-d ডেটাফ্রেমকে 2-ডি ডেটাফ্রেমে রূপান্তর করার চেষ্টা করছি। প্রথমে আমার নীচের 1-ডি ডেটাফ্রেম রয়েছে

a_array = [1,2,3,4,5,6,7,8]
a_df = pd.DataFrame(a_array).T

এবং আমি আকার হিসাবে এটি একটি 2-ডে ডাটাফ্রেমে রূপান্তর করতে যাচ্ছি 2x4। আমি নিম্নলিখিত হিসাবে 2-ডি ডেটাফ্রেমে প্রিসেট করে শুরু করব:

b_df = pd.DataFrame(columns=range(4),index=range(2))

তারপরে আমি নীচের কোডটি দিয়ে a_df(1-d) b_df(2-d) রূপান্তর করতে সহায়তা করতে আমি লুপ ব্যবহার করি

for i in range(2):
    b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]

এটি কেবল আমাকে নিম্নলিখিত ফলাফল দেয়

     0    1    2    3
0    1    2    3    4
1  NaN  NaN  NaN  NaN

কিন্তু যখন আমি পরিবর্তন b_df.iloc[i,:]করতে b_df.iloc[i][:]। ফলাফলটি নীচের মতো সঠিক, যা আমি চাই

   0  1  2  3
0  1  2  3  4
1  5  6  7  8

কেউ আমার কাছে ব্যাখ্যা গেল কি মধ্যে পার্থক্য .iloc[i,:]এবং .iloc[i][:], এবং কেন .iloc[i][:]উপরে কিন্তু আমার উদাহরণে কাজ.iloc[i,:]


এটা কৌতূহলী। b_df.iloc[1] = a_df.iloc[0, 4:8]নির্ধারণ সূচকের সাথে একটি সিরিজ [4, 5, 6, 7]সূচক সঙ্গে একটি সিরিজ [0, 1, 2, 3]। কোনও ওভারল্যাপ নেই তাই NaNসমস্ত উপাদানকে বরাদ্দ করুন। এই মুহুর্তে এটি আমার কাছে বোধগম্য হয়। তবে আপনার মতো আমি কেন অস্পষ্ট b_df.iloc[1][:] = ...আচরণ করি তা সম্পর্কে অস্পষ্ট the বস্তুগুলি পরীক্ষা করা b_df.iloc[1]এবং b_df.iloc[1][:]সূচকগুলির মধ্যে কোনও পার্থক্য প্রকাশ করে না। আমার সর্বোত্তম অনুমানটি [:]হ'ল সরাসরি অনুলিপি ( ) সরবরাহ করার বিষয়টি পান্ডাদের দ্বারা একটি বিশেষ কেস হিসাবে বিবেচনা করা হয় যা এ্যাসিগ্নির সূচকে উপেক্ষা করে এবং এই তাত্পর্য তৈরি করে।
Seb

আমি মনে করি এটি সূচকটি এবং এটির প্রথম সারির সাফল্য কারণ এর একই সূচক রয়েছে
ফুং ডু ফং

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

3
দ্বিতীয়ত, .iloc [i] [:] ব্যবহারকে সূচক শৃঙ্খলা বলা হয় এবং এটি সাধারণত পান্ডায় বেশ বড় "নো-না"। পান্ডাসের সাথে কিছু আইজু রয়েছে যা কোনও বস্তুর দৃষ্টিভঙ্গি তৈরি করে বা স্মৃতিতে একটি ব্র্যান্ড নতুন অবজেক্ট তৈরি করে যা কিছু অপ্রত্যাশিত ফলাফল পেতে পারে।
স্কট বোস্টন

সমস্ত কাজের উত্তর upvote করতে ভুলবেন না, এবং আপনি সবচেয়ে পছন্দ একটি গ্রহণ করুন। সম্ভবত আপনি এটি জানেন, তবে এটি সম্প্রদায়কে জানাতে হবে যে কোন উত্তরগুলি কার্যকর ছিল এবং সেইসাথে তাদের সময় এবং প্রচেষ্টার জন্য লোকদের পুরস্কৃত করতে পারে;) এই মেটা.স্ট্যাকেক্সেঞ্জ / প্রশ্নগুলি / ২৩৩৪/ এবং মেটা.স্ট্যাকেক্সেঞ্জার.কম দেখুন See প্রশ্ন / 173399 /
alan.elkin

উত্তর:


3

ফেরত দেওয়ার সময় series.iloc[:]এবং এর মধ্যে খুব বড় পার্থক্য রয়েছে series[:](i)locঅ্যাসিগিনিয়ের সূচকের সাথে আপনি যা যা বরাদ্দ করছেন তা সবসময় পরীক্ষা করে দেখুন। এদিকে [:]সিনট্যাক্স সূচী বিন্যস্তিকে বাইপাস করে অন্তর্নিহিত নম্পপি অ্যারেগুলিকে নির্ধারিত করে।

s = pd.Series(index=[0, 1, 2, 3], dtype='float')  
s                                                                          

0   NaN
1   NaN
2   NaN
3   NaN
dtype: float64

# Let's get a reference to the underlying array with `copy=False`
arr = s.to_numpy(copy=False) 
arr 
# array([nan, nan, nan, nan])

# Reassign using slicing syntax
s[:] = pd.Series([1, 2, 3, 4], index=['a', 'b', 'c', 'd'])                 
s                                                                          

0    1
1    2
2    3
3    4
dtype: int64

arr 
# array([1., 2., 3., 4.]) # underlying array has changed

# Now, reassign again with `iloc`
s.iloc[:] = pd.Series([5, 6, 7, 8], index=[3, 4, 5, 6]) 
s                                                                          

0    NaN
1    NaN
2    NaN
3    5.0
dtype: float64

arr 
# array([1., 2., 3., 4.])  # `iloc` created a new array for the series
                           # during reassignment leaving this unchanged

s.to_numpy(copy=False)     # the new underlying array, for reference                                                   
# array([nan, nan, nan,  5.]) 

এখন আপনি যে পার্থক্যটি বুঝতে পেরেছেন, আসুন আপনার কোডে কী ঘটে তা দেখুন। আপনি কী বরাদ্দ করছেন তা দেখতে কেবল আপনার লুপের আরএইচএস প্রিন্ট করুন:

for i in range(2): 
    print(a_df.iloc[0, i*4:(i+1)*4]) 

# output - first row                                                                   
0    1
1    2
2    3
3    4
Name: 0, dtype: int64
# second row. Notice the index is different
4    5
5    6
6    7
7    8
Name: 0, dtype: int64   

যখন থেকে বরাদ্দ b_df.iloc[i, :]দ্বিতীয় পুনরাবৃত্তির, ইনডেক্স ভিন্ন তাই কিছুই নির্ধারিত হয় এবং আপনি শুধুমাত্র Nans দেখুন। তবে পরিবর্তিত b_df.iloc[i, :]হওয়ার b_df.iloc[i][:]অর্থ আপনি অন্তর্নিহিত NumPy অ্যারেতে বরাদ্দ করেছেন, তাই সূচীকরণ প্রান্তিককরণটি বাইপাস করা হবে। এই অপারেশন হিসাবে ভাল প্রকাশ করা হয়

for i in range(2):
    b_df.iloc[i, :] = a_df.iloc[0, i*4:(i+1)*4].to_numpy()

b_df                                                                       

   0  1  2  3
0  1  2  3  4
1  5  6  7  8

এটি উল্লেখ করার মতো এটি চেইন অ্যাসাইনমেন্টের একটি রূপ যা কোনও ভাল জিনিস নয় এবং আপনার কোডটি পড়া এবং বুঝতে আরও শক্ত করে তোলে।


1
এখন আমি এটি বুঝতে পেরেছি, আপনাকে ধন্যবাদ। আমি অনুগ্রহ প্রদানের আগে, আপনি কি এর জন্য একটি রেফারেন্স যুক্ত করতে পারেন: " [:]সিনট্যাক্সটি অন্তর্নিহিত নুমপি অ্যারেতে নির্ধারিত করে"?
Seb

@ সেব আপনি ডকুমেন্টেশনে এই বিষয়ে সত্যই রেফারেন্স পাবেন না কারণ এটি কিছুটা বাস্তবায়ন বিশদ। এর জন্য দায়ী গিটহাবের কোড খুঁজে পাওয়া আরও সহজ হতে পারে তবে আমি মনে করি সবচেয়ে সহজ উপায় হ'ল কী ঘটে তা কেবল প্রদর্শন করা। আমি আমার উত্তরের শীর্ষে ছোট্ট উদাহরণটি সম্পাদনা করেছি তা দেখানোর জন্য যে বিভিন্ন ধরণের পুনরায় নিয়োগের সময় অন্তর্নিহিত অ্যারে কীভাবে ম্যানিপুলেটেড হয়। আশা করি বিষয়গুলি আরও পরিষ্কার হয়!
cs95

তোমাকে অনেক ধন্যবাদ! এটা এখন অনেক পরিষ্কার।
টমি ইপ

0

পার্থক্যটি হ'ল প্রথম ক্ষেত্রে পাইথন দোভাষী এই কোডটি কার্যকর করেছিলেন:

b_df.iloc[i,:] = a_df.iloc[0,i*4:(i+1)*4]
#as
b_df.iloc.__setitem__((i, slice(None)), value)

যেখানে মানটি হবে সমীকরণের ডানদিকে। যেখানে দ্বিতীয় ক্ষেত্রে পাইথন দোভাষী এই কোডটি কার্যকর করেছিলেন:

b_df.iloc[i][:] = a_df.iloc[0,i*4:(i+1)*4]
#as
b_df.iloc.__getitem__(i).__setitem__(slice(None), value)

যেখানে আবার মানটি সমীকরণের ডানদিকে থাকবে।

কীগুলির (i, স্লাইস ( কোনওটি নয়)) এবং স্লাইস (কোনও নয়) এর পার্থক্যের কারণে এই দুটি ক্ষেত্রে প্রতিটিতেই আলাদা পদ্ধতিটিকে সেটাইটেমের অভ্যন্তরে ডাকা হবে Therefore সুতরাং আমাদের আচরণ ভিন্ন।


b_df.iloc[i]এবং b_df.iloc[i][:]একই সূচক আছে। আপনি কেন অন্যটির সাথে মিলে না খাড়া একটি সূচি সহ একটি সিরিজ বরাদ্দ করতে পারেন?
সেব

প্রথম ক্ষেত্রে _set_item দ্বিতীয় কল হবে_সেসিটাম_স্লাইস কল। সুতরাং, আমাদের উপরোক্ত আচরণগুলি
ম্যাপি

0

কেউ কি আমাকে ব্যাখ্যা করতে পারল .iloc[i,:]এবং এর মধ্যে পার্থক্য .iloc[i][:]কী

.iloc[i,:]এবং মধ্যে পার্থক্য.iloc[i][:]

আপনি ক্ষেত্রে ক্ষেত্রে সারি এর সমস্ত ( ) কলামটি নির্বাচন .iloc[i,:]করে সরাসরি একটি নির্দিষ্ট সম্ভাবনায় প্রবেশ করতে চলেছেন । আমি যতদূর জানি, এটি ২ য় মাত্রা অনির্দিষ্ট ( ) রেখে যাওয়ার সমান isDataFrame:i.iloc[i]

আপনি ক্ষেত্রে .iloc[i][:]2 টি শৃঙ্খলিত ক্রিয়াকলাপ করছেন। সুতরাং, এর পরে ফলাফল .iloc[i]দ্বারা প্রভাবিত হবে [:]। মান সেট করতে এটি ব্যবহার করে পান্ডাস নিজেই এখানে একটি সতর্কবার্তা দিয়ে নিরুৎসাহিত করেছেন , সুতরাং আপনার এটি ব্যবহার করা উচিত নয়:

কোনও অনুলিপি বা কোনও রেফারেন্স কোনও সেটিংস ক্রিয়াকলাপের জন্য ফিরে আসে কিনা তা প্রসঙ্গে নির্ভর করতে পারে। এটিকে কখনও কখনও শৃঙ্খলিত কার্য বলা হয় এবং এড়ানো উচিত avoided


... এবং কেন .iloc[i][:]উপরে আমার উদাহরণে কাজ করেছে তবে হয়নি.iloc[i,:]

@ স্কট যেমন ওপি মন্তব্যে উল্লিখিত হয়েছে, ডেটা সারিবদ্ধকরণ স্বতন্ত্র , সুতরাং ডানদিকে ডান দিকের সূচকগুলি =বাম পাশে উপস্থিত না থাকলে অন্তর্ভুক্ত করা হবে না। এই কারণেই NaNদ্বিতীয় সারিতে মান রয়েছে are

সুতরাং, বিষয়গুলি পরিষ্কার রাখতে, আপনি নিম্নলিখিত হিসাবে এটি করতে পারেন:

for i in range(2):
    # Get the slice
    a_slice = a_df.iloc[0, i*4:(i+1)*4]
    # Reset the indices
    a_slice.reset_index(drop=True, inplace=True)
    # Set the slice into b_df
    b_df.iloc[i,:] = a_slice

অথবা আপনি listব্যবহারের পরিবর্তে রূপান্তর করতে পারেন reset_index:

for i in range(2):
    # Get the slice
    a_slice = a_df.iloc[0, i*4:(i+1)*4]
    # Convert the slice into a list and set it into b_df
    b_df.iloc[i,:] = list(a_slice)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.