ith
সারিটি নির্বাচন করতে , ব্যবহার করুনiloc
:
In [31]: df_test.iloc[0]
Out[31]:
ATime 1.2
X 2.0
Y 15.0
Z 2.0
Btime 1.2
C 12.0
D 25.0
E 12.0
Name: 0, dtype: float64
Btime
কলামটিতে ith মানটি নির্বাচন করতে আপনি ব্যবহার করতে পারেন:
In [30]: df_test['Btime'].iloc[0]
Out[30]: 1.2
df_test['Btime'].iloc[0]
(প্রস্তাবিত) এবং এর মধ্যে পার্থক্য রয়েছেdf_test.iloc[0]['Btime']
: এর
ডেটাফ্রেমগুলি কলাম-ভিত্তিক ব্লকগুলিতে ডেটা সঞ্চয় করে (যেখানে প্রতিটি ব্লকের একক dtype থাকে)। আপনি যদি প্রথম কলাম দ্বারা নির্বাচন করেন তবে একটি ভিউ ফেরত দেওয়া যাবে (যা একটি অনুলিপি ফেরত দেওয়ার চেয়ে দ্রুত) এবং মূল টাইপটি সংরক্ষণ করা হবে। বিপরীতে, আপনি যদি প্রথমে সারি দ্বারা নির্বাচন করেন এবং যদি ডেটাফ্রেমে বিভিন্ন ধরণের টাইপের কলাম থাকে, তবে পান্ডস ডেটাটি অবজেক্ট dtype এর একটি নতুন সিরিজে অনুলিপি করে। সুতরাং কলামগুলি নির্বাচন করা সারি নির্বাচনের চেয়ে কিছুটা দ্রুত। সুতরাং, যদিও
df_test.iloc[0]['Btime']
কাজ করে, df_test['Btime'].iloc[0]
কিছুটা বেশি দক্ষ।
যখন দায়িত্ব অর্পণ করা হয় তখন দুজনের মধ্যে একটি বড় পার্থক্য রয়েছে।
df_test['Btime'].iloc[0] = x
প্রভাবিত করে df_test
, কিন্তু df_test.iloc[0]['Btime']
না পারে। কেন একটি ব্যাখ্যা জন্য নীচে দেখুন। ইনডেক্সিংয়ের ক্রমের একটি সূক্ষ্ম পার্থক্য আচরণে একটি বড় পার্থক্য তৈরি করে, একক সূচীকরণ কার্যনির্বাহী ব্যবহার করা আরও ভাল:
df.iloc[0, df.columns.get_loc('Btime')] = x
df.iloc[0, df.columns.get_loc('Btime')] = x
(প্রস্তাবিত):
প্রস্তাবিত উপায় একটি DataFrame নির্ধারিত নতুন মান হয় শৃঙ্খলিত ইন্ডেক্স এড়াতে , এবং পরিবর্তে পদ্ধতি ব্যবহার অ্যান্ড্রু দ্বারা প্রদর্শিত ,
df.loc[df.index[n], 'Btime'] = x
অথবা
df.iloc[n, df.columns.get_loc('Btime')] = x
পরবর্তী পদ্ধতিটি কিছুটা দ্রুত, কারণ df.loc
সারি এবং কলামের লেবেলগুলিকে অবস্থানীয় সূচকগুলিতে রূপান্তর করতে হয়, সুতরাং df.iloc
পরিবর্তে আপনি যদি ব্যবহার করেন তবে কিছুটা কম রূপান্তর প্রয়োজন
।
df['Btime'].iloc[0] = x
কাজ করে, তবে সুপারিশ করা হয় না:
যদিও এটি কাজ করে, বর্তমানে এটি ডেটা ফ্রেমগুলি যেভাবে প্রয়োগ করা হচ্ছে সেটার সুযোগ নিয়েছে । ভবিষ্যতে পান্ডাদের এভাবে কাজ করতে হবে এমন কোনও গ্যারান্টি নেই। বিশেষত, এটি এই সুবিধাটি গ্রহণ করছে যে (বর্তমানে) df['Btime']
সর্বদা একটি দর্শন দেয় (অনুলিপিটি নয়) তাই এর কলামের নবম স্থানে একটি নতুন মান নির্ধারণdf['Btime'].iloc[n] = x
করতে ব্যবহার করা যেতে পারে ।Btime
df
যেহেতু পান্ডারা সূচকগুলি যখন অনুলিপি তুলনায় কোনও ভিউ ফেরত দেয় সে সম্পর্কে কোনও স্পষ্ট গ্যারান্টি দেয় না, শৃঙ্খলাবদ্ধ সূচক ব্যবহার করা কার্যাদি সাধারণত সর্বদা একটি উত্থাপন করে SettingWithCopyWarning
যদিও এই ক্ষেত্রে অ্যাসাইনমেন্টটি সংশোধন করতে সফল হয় df
:
In [22]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [24]: df['bar'] = 100
In [25]: df['bar'].iloc[0] = 99
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
self._setitem_with_indexer(indexer, value)
In [26]: df
Out[26]:
foo bar
0 A 99 <-- assignment succeeded
2 B 100
1 C 100
df.iloc[0]['Btime'] = x
কাজ করে না:
বিপরীতে, এর সাথে অ্যাসাইনমেন্ট df.iloc[0]['bar'] = 123
কাজ করে না কারণ df.iloc[0]
একটি অনুলিপি প্রদান করছে:
In [66]: df.iloc[0]['bar'] = 123
/home/unutbu/data/binky/bin/ipython:1: SettingWithCopyWarning:
A value is trying to be set on a copy of a slice from a DataFrame
See the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
In [67]: df
Out[67]:
foo bar
0 A 99 <-- assignment failed
2 B 100
1 C 100
সতর্কতা : আমি আগে পরামর্শ দিয়েছিলাম df_test.ix[i, 'Btime']
। তবে অবস্থান অনুসারে সূচকে চেষ্টা করার আগে লেবেল অনুসারে সূচকে চেষ্টা করার ith
কারণে এটি আপনাকে মূল্য দেওয়ার গ্যারান্টিযুক্ত নয় । সুতরাং যদি ডেটাফ্রেমের কোনও পূর্ণসংখ্যার সূচক থাকে যা 0 থেকে শুরু অনুসারে বাছাই করা থাকে না, তবে ব্যবহার করে সারিটির পরিবর্তে সারিটির পরিবর্তে লেবেলটি দেওয়া হবে । উদাহরণ স্বরূপ,ix
ix[i]
i
ith
In [1]: df = pd.DataFrame({'foo':list('ABC')}, index=[0,2,1])
In [2]: df
Out[2]:
foo
0 A
2 B
1 C
In [4]: df.ix[1, 'foo']
Out[4]: 'C'
df_test.head(1)
কাজ করবে,iloc
আনতবু দ্বারা উত্তর হিসাবে আরও সাধারণ ফর্মটি ব্যবহার করা হবে